o
    èó·ik2  ã                   @   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¡ dedeee ee f f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de
dee fdd„Zd	d
„ Zdede
dee fdd„Zdedefdd„Zdd„ Zdd„ Zedee	 f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   r   )ÚlogÚdebugZ_fail_connection)Úselfr   r   © r   ú]C:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\autobahn/wamp/websocket.pyÚ_bailout5   s   
ÿzWampWebSocketProtocol._bailoutc              
   C   s~   z| j  ¡ | _| | 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Ú_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ÚwasCleanc                 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}")r0   r   r   r   r    )	Z_onclose_reasonr   r   r   ÚonCloser(   r)   r*   r+   )r   r0   r   r   r   r   r   r1   J   s   
þÿ
õzWampWebSocketProtocol.onCloseÚpayloadÚisBinaryc                 C   s>  zI| j  ||¡D ]>}| jjdtdddd�| jjr!t| 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 dS  t	yt } z| jj
dt ¡ d� d |¡}| jtjj|d� W Y d}~dS d}~w tyž } 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`
        ú<
{action1}{session}, {authid}{action2}
  {message}
{action3}zWAMP-Receive(ÚgreenT©Ú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   r2   r3   Úmsgr/   r   r   r   r   r@   ]   s.   úø

 €
 €ýzWampWebSocketProtocol.onMessagec                 C   sØ   |   ¡ riz@| jjdtdddd�| jjrt| 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 |¡\}}W n t	y` } z| j 
d |¡¡ td |¡ƒ‚d}~ww |  ||¡ dS tƒ ‚)zM
        Implements :func:`autobahn.wamp.interfaces.ITransport.send`
        r4   zWAMP-Transmit(ÚredTr6   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   r2   r3   r/   r   r   r   Úsendv   s$   ú€ýzWampWebSocketProtocol.sendc                 C   s
   | j duS )zO
        Implements :func:`autobahn.wamp.interfaces.ITransport.isOpen`
        N)r   ©r   r   r   r   rC   �   s   
zWampWebSocketProtocol.isOpenÚreturnc                 C   s   | j S )zZ
        Implements :func:`autobahn.wamp.interfaces.ITransport.transport_details`
        N)r   rG   r   r   r   Útransport_details“   s   z'WampWebSocketProtocol.transport_detailsc                 C   ó    |   ¡ r|  tjj¡ dS tƒ ‚)zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.close`
        N)rC   Z	sendCloser   r-   ZCLOSE_STATUS_CODE_NORMALr   rG   r   r   r   Úcloseš   ó   zWampWebSocketProtocol.closec                 C   rJ   )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.abort`
        N)rC   r   r   r-   ZCLOSE_STATUS_CODE_GOING_AWAYr   rG   r   r   r   Úabort£   rL   zWampWebSocketProtocol.abort©N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   Ú__annotations__r   r
   ÚintÚstrr   r'   Úboolr1   Úbytesr@   rF   rC   ÚpropertyrI   rK   rM   r   r   r   r   r   -   s   
 	r   ÚsubprotocolrH   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   ZwampzFWAMP WebSocket subprotocol identifier must start with "wamp", not "{}"é   é   )NN)Úsplitr(   r,   rT   Újoin)rY   ÚsÚversionÚserializer_idr   r   r   ÚparseSubprotocolIdentifier°   s   

rb   c                   @   s:   e Zd ZdZdZdedeee e	eef f fdd„Z
dS )r   z:
    Mixin for WAMP-over-WebSocket server transports.
    TÚrequestrH   c                 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`
        r\   z1This server only speaks WebSocket subprotocols {}ú, ÚjsonN)Ú	protocolsrb   r$   Ú_serializersÚkeysÚcopyr<   ÚSTRICT_PROTOCOL_NEGOTIATIONr   ÚBAD_REQUESTr,   r^   )r   rc   ÚheadersrY   r`   ZserializerIdr   r   r   Ú	onConnectÃ   s   
€
ÿz%WampWebSocketServerProtocol.onConnectN)rO   rP   rQ   rR   rk   r   r   r   rU   r   rn   r   r   r   r   r   ¼   s    *r   c                   @   s"   e Zd ZdZdZdefdd„ZdS )r   z:
    Mixin for WAMP-over-WebSocket client transports.
    TÚresponsec                 C   sX   |j | jjvr| jrtd d | jj¡¡ƒ‚d}nt|j ƒ\}}t | jj	| ¡| _
dS )rd   zLThe server does not speak any of the WebSocket subprotocols {} we requested.re   rf   N)r   r$   rg   rk   r(   r,   r^   rb   rj   rh   r<   )r   ro   ra   r`   r   r   r   rn   à   s   ÿz%WampWebSocketClientProtocol.onConnectN)rO   rP   rQ   rR   rk   r	   rn   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                    sf  t ˆ ƒrˆ | _n‡ fdd„| _|du r›g }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 |s›t	dƒ‚i | _
|D ]}|| j
|j< q d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 rN   r   r   ©r$   r   r   Ú<lambda>  s    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.serializerrs   ÚappendÚImportErrorrt   ru   rv   r(   rh   rw   Z
_protocols)r   r$   Zserializersrs   rt   ru   rv   ry   r   rq   r   Ú__init__÷   sN   ÿÿÿÿzWampWebSocketFactory.__init__rN   )rO   rP   rQ   rR   r~   r   r   r   r   rp   ò   s    rp   c                   @   ó   e Zd ZdZdS )r   zC
    Mixin for WAMP-over-WebSocket server transport factories.
    N©rO   rP   rQ   rR   r   r   r   r   r   5  ó    r   c                   @   r   )r   zC
    Mixin for WAMP-over-WebSocket client transport factories.
    Nr€   r   r   r   r   r   ;  r�   r   )#rj   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   ÚregisterrU   rT   rb   r   r   rp   r   r   r   r   r   r   Ú<module>   s&    
"C