U
    •uÄcKF  ã                   @   s‚  d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlmZm	Z	m
Z
 d dlmZmZmZ d dlmZ d dlmZmZmZ dZd ZdZd	Zd
ZG dd„ de jƒZG dd„ deƒZdZddd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%eG dd „ d e$e%e"ƒƒZ&eG d!d"„ d"e$e%e!ƒƒZ'G d#d$„ d$e#ƒZ(eG d%d&„ d&e(ƒƒZ)eG d'd(„ d(e(ƒƒZ*dS ))é    N)ÚOptional)ÚpublicÚ_LazyHexFormatterÚhltype)ÚProtocolErrorÚSerializationErrorÚTransportLost)ÚTransportDetails)Úget_serializersÚcreate_transport_detailsÚtransport_channel_id)ÚWampRawSocketServerProtocolÚWampRawSocketClientProtocolÚWampRawSocketServerFactoryÚWampRawSocketClientFactoryé   é   é   c                   @   s¶   e Zd ZU dZe e¡ZdZeZe	 
¡ ZdZee ed< dZee ed< eee dœdd„ƒZd	d
„ Ze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 )ÚPrefixProtocolz!Lé   NÚpeerÚ	is_server)Úreturnc                 C   s   | j S )zZ
        Implements :func:`autobahn.wamp.interfaces.ITransport.transport_details`
        )Ú_transport_details©Úself© r   úcc:\users\psant\downloads\hotstarbackend\school\venv\Lib\site-packages\autobahn\asyncio\rawsocket.pyÚtransport_details?   s    z PrefixProtocol.transport_detailsc                 C   sV   | j jd| jd� || _t| j| jƒ| _tj| j_	| jj| _d| _
d | _t ¡ | _d S )Nz3RawSocker Asyncio: Connection made with peer {peer})r   ó    )ÚlogÚdebugr   Ú	transportr   r   r   r	   ZCHANNEL_FRAMING_RAWSOCKETZchannel_framingÚ_bufferÚ_headerÚtxaioÚcreate_futureÚ_wait_closed©r   r"   r   r   r   Úconnection_madeF   s    

zPrefixProtocol.connection_madec                 C   s*   t | dƒr| jS t ¡ }| d¡ |S d S )Nr'   T)Úhasattrr'   r%   r&   Ú
set_result)r   Úfr   r   r   Ú	is_closedX   s
    

zPrefixProtocol.is_closedc                 C   s,   | j  d¡ d | _| j d¡ |  |¡ d S )Nz"RawSocker Asyncio: Connection lostT)r    r!   r"   r'   r+   Ú_on_connection_lost©r   Úexcr   r   r   Úconnection_losta   s    zPrefixProtocol.connection_lostc                 C   s   d S ©Nr   r/   r   r   r   r.   g   s    z"PrefixProtocol._on_connection_lostc                 C   s   | j  |¡ | j ¡  d S r2   )r    Úerrorr"   Úclose)r   Úmsgr   r   r   Úprotocol_errorj   s    zPrefixProtocol.protocol_errorc                 C   sH   t |ƒ}|| jkrtdƒ‚t | jt |ƒ¡}| j |¡ | j |¡ d S )NzData too big)ÚlenÚmax_length_sendÚ
ValueErrorÚstructÚpackÚprefix_formatr"   Úwrite)r   ÚdataÚlÚheaderr   r   r   Ú
sendStringn   s    
zPrefixProtocol.sendStringc                 C   s
   t ƒ ‚d S r2   ©ÚNotImplementedError©r   r>   r   r   r   Úpingv   s    zPrefixProtocol.pingc                 C   s
   t ƒ ‚d S r2   rB   rD   r   r   r   Úpongy   s    zPrefixProtocol.pongc                 C   s`  |  j |7  _ d}t| j ƒ}|| jk�rL| jr:| j\}}nt| j ||| j … }t|dd… ƒd@ }|tkrx|  d¡ d S t | j	d|dd …  ¡d }|| j
kr®|  d¡ d S || j |k�r<d | _|| j7 }|| j8 }| j ||| … }||7 }||8 }|tk�r|  |¡ n*|tk�r&|  |¡ n|tk�rJ|  |¡ q||f| _�qLq| j |d … | _ d S )Nr   r   é   zInvalid frame typeó    zFrame too big)r#   r7   Úprefix_lengthr$   ÚordÚFRAME_TYPE_PONGr6   r:   Úunpackr<   Ú
max_lengthÚFRAME_TYPE_DATAÚstringReceivedÚFRAME_TYPE_PINGrE   rF   )r   r>   ÚposZ	remainingZ
frame_typeZframe_lengthr@   r   r   r   Údata_received|   s>    









zPrefixProtocol.data_receivedc                 C   s
   t ƒ ‚d S r2   rB   rD   r   r   r   rO   ¤   s    zPrefixProtocol.stringReceived)Ú__name__Ú
__module__Ú__qualname__r<   r:   ÚcalcsizerI   rM   r8   r%   Úmake_loggerr    r   r   ÚstrÚ__annotations__r   ÚboolÚpropertyr	   r   r)   r-   r1   r.   r6   rA   rE   rF   rR   rO   r   r   r   r   r   5   s(   


(r   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚRawSocketProtocolc                 C   sX   d }|rHt t t |d¡¡ƒd }|dkr2tdƒ‚d|d  | _|| _nd| _d| _d S )Nr   é	   é   zMaximum length is 16Mr   )ÚintÚmathÚceilr    r9   rM   Ú_length_exp)r   Úmax_sizeÚexpr   r   r   Ú__init__ª   s    zRawSocketProtocol.__init__c                 C   s   t  | |¡ d| _d S )NF)r   r)   Ú_handshake_doner(   r   r   r   r)   ¶   s    z!RawSocketProtocol.connection_madec                 C   s
   t ƒ ‚d S r2   rB   r   r   r   r   Ú_on_handshake_completeº   s    z(RawSocketProtocol._on_handshake_completec                 C   st   t | jd d… ƒ}|d tkr&tdƒ‚|d d@ }|d d? }d|d  | _|d dksd|d dkrltd	ƒ‚||fS )
Né   r   zInvalid magic byte in handshaker   r^   r   r]   é   zReserved bytes must be zero)Ú	bytearrayr#   Ú
MAGIC_BYTEÚHandshakeErrorr8   )r   ÚbufÚserÚlexpr   r   r   Úparse_handshake½   s    z!RawSocketProtocol.parse_handshakec                 C   s
   t ƒ ‚d S r2   rB   r   r   r   r   Úprocess_handshakeÈ   s    z#RawSocketProtocol.process_handshakec              
   C   sÀ   | j jdt|ƒd� | jr&t | |¡S |  j|7  _t| jƒdkr¼z|  ¡  W n: t	k
rˆ } z|  
dj|d�¡ W Y ¢d S d }~X Y nX d| _|  ¡  | jdd … }d| _|r¼t | |¡ d S )Nz'RawSocker Asyncio: data received {data})r>   rh   zHandshake error : {err}©ÚerrTr   )r    r!   r   rf   r   rR   r#   r7   rq   rl   r6   Úformatrg   )r   r>   Úer   r   r   rR   Ë   s     zRawSocketProtocol.data_receivedN)	rS   rT   rU   re   r)   rg   rp   rq   rR   r   r   r   r   r\   ¨   s   r\   zillegal (must not be used)zserializer unsupportedz#maximum message length unacceptablez*use of reserved bits (unsupported feature)z maximum connection count reached)r   r   r   ri   rh   c                   @   s   e Zd Zddd„ZdS )rl   r   c                 C   s&   t  | |s|n|dt |¡  ¡ d S )Nz : %s)Ú	Exceptionre   ÚERRMAPÚget)r   r5   Úcoder   r   r   re   ë   s    zHandshakeError.__init__N)r   )rS   rT   rU   re   r   r   r   r   rl   ê   s   rl   c                   @   s4   e Zd ZdZdd„ Zdd„ Zedd„ ƒZdd	„ Zd
S )ÚRawSocketClientProtocolFc                 C   s   dS )NTr   ©r   Úser_idr   r   r   Úcheck_serializeró   s    z(RawSocketClientProtocol.check_serializerc                 C   s>   |   ¡ \}}|dkrtd|ƒ‚| j|kr:td || j¡ƒ‚d S )Nr   zServer returned handshake errorz;Server returned different serializer {0} then requested {1})rp   rl   Úserializer_idrt   )r   r|   rs   r   r   r   rq   ö   s    

 ÿz)RawSocketClientProtocol.process_handshakec                 C   s
   t ƒ ‚d S r2   rB   r   r   r   r   r~   þ   s    z%RawSocketClientProtocol.serializer_idc                 C   sF   t  | |¡ ttt| jd> | jB ddgƒƒ}| |¡ | j 	d¡ d S )Nrh   r   z(RawSocket Asyncio: Client handshake sent)
r\   r)   Úbytesrj   rk   rb   r~   r=   r    r!   )r   r"   Zhsr   r   r   r)     s     þ
z'RawSocketClientProtocol.connection_madeN)	rS   rT   rU   r   r}   rq   r[   r~   r)   r   r   r   r   rz   ï   s   
rz   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚRawSocketServerProtocolTc                 C   s
   t ƒ ‚d S r2   rB   r{   r   r   r   Úsupports_serializer  s    z+RawSocketServerProtocol.supports_serializerc                    sL   ‡ fdd„}ˆ   ¡ \}}ˆ  |¡s<|tdƒ tdj|d�ƒ‚|ˆ j|ƒ d S )Nc                    s0   | d> |d@ B }ˆ j  ttt|ddgƒƒ¡ d S )Nrh   r^   r   )r"   r=   r   rj   rk   )ro   r|   Zb2r   r   r   Úsend_response  s    z@RawSocketServerProtocol.process_handshake.<locals>.send_responser   z!Serializer unsupported : {ser_id})r|   )rp   r�   ÚERR_SERIALIZER_UNSUPPORTEDrl   rt   rb   )r   r‚   r|   Z_lexpr   r   r   rq     s    

z)RawSocketServerProtocol.process_handshakeN)rS   rT   rU   r   r�   rq   r   r   r   r   r€     s   r€   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚWampRawSocketMixinGeneralc              
   C   sš   | j  d¡ zB| jjr4dt| j| jjdƒi}|| j_| j 	¡ | _
| j
 | ¡ W n: tk
rˆ } z| j jd|d� |  ¡  W 5 d }~X Y nX | j  d¡ d S )Nz)WampRawSocketProtocol: Handshake completez
tls-uniquezMWampRawSocketProtocol: ApplicationSession constructor / onOpen raised ({err})rr   zApplicationSession started.)r    r!   r   Z	is_securer   r"   r   Ú
channel_idÚfactoryÚ_factoryÚ_sessionZonOpenrv   ÚwarnÚabortÚinfo)r   r…   ru   r   r   r   rg   !  s     ÿz0WampRawSocketMixinGeneral._on_handshake_completec              
   C   s¾   | j jdt|ƒd� z2| j |¡D ] }| j jd|d� | j |¡ q"W nr tk
r€ } z| j jd|d� |  	¡  W 5 d }~X Y n: t
k
r¸ } z| j jd|d� |  	¡  W 5 d }~X Y nX d S )Nz*WampRawSocketProtocol: RX octets: {octets}©Zoctetsz-WampRawSocketProtocol: RX WAMP message: {msg})r5   zHWampRawSocketProtocol: WAMP Protocol Error ({err}) - aborting connectionrr   zHWampRawSocketProtocol: WAMP Internal Error ({err}) - aborting connection)r    r!   r   Ú_serializerZunserializerˆ   Z	onMessager   r‰   rŠ   rv   )r   Úpayloadr5   ru   r   r   r   rO   7  s    z(WampRawSocketMixinGeneral.stringReceivedc              
   C   s�   |   ¡ r†| jjdt| jƒ|d� z| j |¡\}}W n0 tk
rd } ztd 	|¡ƒ‚W 5 d}~X Y qŒX |  
|¡ | jjdt|ƒd� ntƒ ‚dS )zM
        Implements :func:`autobahn.wamp.interfaces.ITransport.send`
        z{func}: TX WAMP message: {msg})Úfuncr5   zIWampRawSocketProtocol: unable to serialize WAMP application payload ({0})Nz*WampRawSocketProtocol: TX octets: {octets}rŒ   )ÚisOpenr    r!   r   Úsendr�   Ú	serializerv   r   rt   rA   r   r   )r   r5   rŽ   Ú_ru   r   r   r   r‘   F  s    ÿ
zWampRawSocketMixinGeneral.sendc                 C   s   t | dƒo| jdk	S )zO
        Implements :func:`autobahn.wamp.interfaces.ITransport.isOpen`
        rˆ   N)r*   rˆ   r   r   r   r   r�   X  s    z WampRawSocketMixinGeneral.isOpenN)rS   rT   rU   rg   rO   r‘   r�   r   r   r   r   r„     s   r„   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚWampRawSocketMixinAsynciozE
    Base class for asyncio-based WAMP-over-RawSocket protocols.
    c              
   C   sV   z|d k}| j  |¡ W n2 tk
rJ } z| jjd|d� W 5 d }~X Y nX d | _ d S )Nz@WampRawSocketProtocol: ApplicationSession.onClose raised ({err})rr   )rˆ   ZonCloserv   r    r‰   )r   r0   ZwasCleanru   r   r   r   r.   e  s    "z-WampRawSocketMixinAsyncio._on_connection_lostc                 C   s   |   ¡ r| j ¡  ntƒ ‚dS )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.close`
        N)r�   r"   r4   r   r   r   r   r   r4   n  s    zWampRawSocketMixinAsyncio.closec                 C   s6   |   ¡ r,t| jdƒr | j ¡  q2| j ¡  ntƒ ‚dS )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.abort`
        rŠ   N)r�   r*   r"   rŠ   r4   r   r   r   r   r   rŠ   w  s
    zWampRawSocketMixinAsyncio.abortN)rS   rT   rU   Ú__doc__r.   r4   rŠ   r   r   r   r   r”   `  s   		r”   c                   @   s   e Zd ZdZdd„ ZdS )r   z…
    asyncio-based WAMP-over-RawSocket server protocol.

    Implements:

        * :class:`autobahn.wamp.interfaces.ITransport`
    c                 C   s^   || j jkr4t | j j| ¡| _| jjd|d� dS | jjd|| j j ¡ d� |  ¡  dS d S )NzDWampRawSocketProtocol: client wants to use serializer '{serializer}')Ú
serializerTz�WampRawSocketProtocol: opening handshake - no suitable serializer found (client requested {serializer}, and we have {serializers})r–   ÚserializersF)r†   Ú_serializersÚcopyr�   r    r!   ÚkeysrŠ   r{   r   r   r   r�   �  s    þ
ýz/WampRawSocketServerProtocol.supports_serializerN)rS   rT   rU   r•   r�   r   r   r   r   r   …  s   r   c                   @   s   e Zd ZdZedd„ ƒZdS )r   z…
    asyncio-based WAMP-over-RawSocket client protocol.

    Implements:

        * :class:`autobahn.wamp.interfaces.ITransport`
    c                 C   s"   t | dƒst | jj¡| _| jjS )Nr�   )r*   r™   r†   r�   ÚRAWSOCKET_SERIALIZER_IDr   r   r   r   r~   «  s    
z)WampRawSocketClientProtocol.serializer_idN)rS   rT   rU   r•   r[   r~   r   r   r   r   r   ¡  s   r   c                   @   s$   e Zd ZdZe ¡ Zedd„ ƒZdS )ÚWampRawSocketFactoryzm
    Adapter class for asyncio-based WebSocket client and server factories.def dataReceived(self, data):
    c                 C   s   |   ¡ }| |_|S r2   )Úprotocolr†   )r   Úprotor   r   r   Ú__call__¹  s    zWampRawSocketFactory.__call__N)	rS   rT   rU   r•   r%   rW   r    r   rŸ   r   r   r   r   rœ   ²  s   rœ   c                   @   s   e Zd ZdZeZddd„ZdS )r   zD
    asyncio-based WAMP-over-RawSocket server protocol factory.
    Nc                    sV   t ˆ ƒrˆ | _n‡ fdd„| _|dkrBdd„ tƒ D ƒ}|sBtdƒ‚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 all available serializers).
        :type serializers: list of objects implementing
            :class:`autobahn.wamp.interfaces.ISerializer`
        c                      s   ˆ S r2   r   r   ©r†   r   r   Ú<lambda>Ö  r   z5WampRawSocketServerFactory.__init__.<locals>.<lambda>Nc                 S   s   g | ]
}|ƒ ‘qS r   r   )Ú.0r–   r   r   r   Ú
<listcomp>Û  s     z7WampRawSocketServerFactory.__init__.<locals>.<listcomp>z%could not import any WAMP serializersc                 S   s   i | ]}|j |“qS r   )r›   )r¢   rn   r   r   r   Ú
<dictcomp>à  s      z7WampRawSocketServerFactory.__init__.<locals>.<dictcomp>)Úcallabler‡   r
   rv   r˜   )r   r†   r—   r   r    r   re   Ç  s    z#WampRawSocketServerFactory.__init__)N)rS   rT   rU   r•   r   r�   re   r   r   r   r   r   À  s   r   c                   @   s   e Zd ZdZeZddd„ZdS )r   z;
    asyncio-based WAMP-over-RawSocket client factory.
    Nc                    sT   t ˆ ƒrˆ | _n‡ fdd„| _|dkr:tƒ }|r:|d ƒ }|dkrJtdƒ‚|| _dS )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`
        c                      s   ˆ S r2   r   r   r    r   r   r¡   ù  r   z5WampRawSocketClientFactory.__init__.<locals>.<lambda>Nr   z$could not import any WAMP serializer)r¥   r‡   r
   rv   r�   )r   r†   r–   r—   r   r    r   re   ê  s    
z#WampRawSocketClientFactory.__init__)N)rS   rT   rU   r•   r   r�   re   r   r   r   r   r   ã  s   r   )+Úasyncior:   r`   r™   Útypingr   r%   Zautobahn.utilr   r   r   Zautobahn.wamp.exceptionr   r   r   Zautobahn.wamp.typesr	   Zautobahn.asyncio.utilr
   r   r   Ú__all__rN   rP   rK   rk   ÚProtocolr   r\   rƒ   rw   rv   rl   rz   r€   Úobjectr„   r”   r   r   rœ   r   r   r   r   r   r   Ú<module>   sJ   s7û	A%"