o
    èó·iKF  ã                   @   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dee f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`
        N)Ú_transport_details©Úself© r   ú`C:\Users\psant\Downloads\PAF backend\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 )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   ó   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   ó   t ƒ ‚r2   ©ÚNotImplementedError©r   r?   r   r   r   Úpingv   ó   zPrefixProtocol.pingc                 C   rC   r2   rD   rF   r   r   r   Úpongy   rH   zPrefixProtocol.pongc                 C   s\  |  j |7  _ d}t| j ƒ}|| jkr¤| jr| j\}}n:| j ||| j … }t|dd… ƒd@ }|tkr;|  d¡ d S t | j	d|dd …  ¡d }|| j
krV|  d¡ d S || j |kr™d | _|| j7 }|| j8 }| j ||| … }||7 }||8 }|tkr…|  |¡ n|tkr�|  |¡ n|tkr˜|  |¡ n||f| _q¤|| jks| j |d … | _ d S )Nr   r   é   zInvalid frame typeó    zFrame too big)r#   r8   Úprefix_lengthr$   ÚordÚFRAME_TYPE_PONGr7   r;   Úunpackr=   Ú
max_lengthÚFRAME_TYPE_DATAÚstringReceivedÚFRAME_TYPE_PINGrG   rI   )r   r?   ÚposÚ	remainingZ
frame_typeZframe_lengthrA   r   r   r   Údata_received|   sB   







€

à"zPrefixProtocol.data_receivedc                 C   rC   r2   rD   rF   r   r   r   rR   ¤   rH   zPrefixProtocol.stringReceived)Ú__name__Ú
__module__Ú__qualname__r=   r;   ÚcalcsizerL   rP   r9   r%   Úmake_loggerr    r   r   ÚstrÚ__annotations__r   ÚboolÚpropertyr	   r   r)   r-   r1   r.   r7   rB   rG   rI   rV   rR   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   sZ   d }|r%t t t |d¡¡ƒd }|dkrtdƒ‚d|d  | _|| _d S d| _d| _d S )Nr   é	   é   zMaximum length is 16Mr   )ÚintÚmathÚceilr    r:   rP   Ú_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   rC   r2   rD   r   r   r   r   Ú_on_handshake_completeº   rH   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s2|d dkr6td	ƒ‚||fS )
Né   r   zInvalid magic byte in handshaker   rb   r   ra   é   zReserved bytes must be zero)Ú	bytearrayr#   Ú
MAGIC_BYTEÚHandshakeErrorr9   )r   ÚbufÚserÚlexpr   r   r   Úparse_handshake½   s   z!RawSocketProtocol.parse_handshakec                 C   rC   r2   rD   r   r   r   r   Úprocess_handshakeÈ   rH   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	yC } z|  
dj|d�¡ W Y d }~d S d }~ww d| _|  ¡  | jdd … }d| _|rat | |¡ d S d S d S )Nz'RawSocker Asyncio: data received {data})r?   rl   zHandshake error : {err}©ÚerrTr   )r    r!   r   rj   r   rV   r#   r8   ru   rp   r7   Úformatrk   )r   r?   Úer   r   r   rV   Ë   s(   €þõ
zRawSocketProtocol.data_receivedN)	rW   rX   rY   ri   r)   rk   rt   ru   rV   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   rm   rl   c                   @   s   e Zd Zddd„ZdS )rp   r   c                 C   s,   t  | |s
|¡ d S |dt |¡  ¡ d S )Nz : %s)Ú	Exceptionri   ÚERRMAPÚget)r   r6   Úcoder   r   r   ri   ë   s   ,zHandshakeError.__init__N)r   )rW   rX   rY   ri   r   r   r   r   rp   ê   s    rp   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ó   r3   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})rt   rp   Úserializer_idrx   )r   r€   rw   r   r   r   ru   ö   s   


ÿÿz)RawSocketClientProtocol.process_handshakec                 C   rC   r2   rD   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 )Nrl   r   z(RawSocket Asyncio: Client handshake sent)
r`   r)   Úbytesrn   ro   rf   r‚   r>   r    r!   )r   r"   Zhsr   r   r   r)     s   þ
z'RawSocketClientProtocol.connection_madeN)	rW   rX   rY   r   r�   ru   r_   r‚   r)   r   r   r   r   r~   ï   s    
r~   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚRawSocketServerProtocolTc                 C   rC   r2   rD   r   r   r   r   Úsupports_serializer  rH   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 )Nrl   rb   r   )r"   r>   rƒ   rn   ro   )rs   r€   Úb2r   r   r   Úsend_response  s    z@RawSocketServerProtocol.process_handshake.<locals>.send_responser   z!Serializer unsupported : {ser_id})r€   )rt   r…   ÚERR_SERIALIZER_UNSUPPORTEDrp   rx   rf   )r   r‡   r€   Z_lexpr   r   r   ru     s   

z)RawSocketServerProtocol.process_handshakeN)rW   rX   rY   r   r…   ru   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¡ z!| jjrdt| j| jjdƒi}|| j_| j 	¡ | _
| j
 | ¡ W n tyF } z| j jd|d� |  ¡  W Y d }~d S d }~ww | j  d¡ d S )Nz)WampRawSocketProtocol: Handshake completez
tls-uniquezMWampRawSocketProtocol: ApplicationSession constructor / onOpen raised ({err})rv   zApplicationSession started.)r    r!   r   Z	is_securer   r"   r   Ú
channel_idÚfactoryÚ_factoryÚ_sessionZonOpenrz   ÚwarnÚabortÚinfo)r   rŠ   ry   r   r   r   rk   !  s   ÿ€ýz0WampRawSocketMixinGeneral._on_handshake_completec              
   C   sÄ   | j jdt|ƒd� z| j |¡D ]}| j jd|d� | j |¡ qW d S  tyC } z| j jd|d� |  	¡  W Y d }~d S d }~w t
ya } z| j jd|d� |  	¡  W Y d }~d S d }~ww )Nz*WampRawSocketProtocol: RX octets: {octets}©Úoctetsz-WampRawSocketProtocol: RX WAMP message: {msg})r6   zHWampRawSocketProtocol: WAMP Protocol Error ({err}) - aborting connectionrv   zHWampRawSocketProtocol: WAMP Internal Error ({err}) - aborting connection)r    r!   r   Ú_serializerZunserializer�   Z	onMessager   rŽ   r�   rz   )r   Úpayloadr6   ry   r   r   r   rR   7  s   þ€€þz(WampRawSocketMixinGeneral.stringReceivedc              
   C   s„   |   ¡ r?| jjdt| jƒ|d� z
| j |¡\}}W n ty- } ztd 	|¡ƒ‚d}~ww |  
|¡ | jjdt|ƒd� dS tƒ ‚)zM
        Implements :func:`autobahn.wamp.interfaces.ITransport.send`
        z{func}: TX WAMP message: {msg})Úfuncr6   zIWampRawSocketProtocol: unable to serialize WAMP application payload ({0})Nz*WampRawSocketProtocol: TX octets: {octets}r‘   )ÚisOpenr    r!   r   Úsendr“   Ú	serializerz   r   rx   rB   r   r   )r   r6   r”   Ú_ry   r   r   r   r—   F  s   ÿ€þ
zWampRawSocketMixinGeneral.sendc                 C   s   t | dƒo	| jduS )zO
        Implements :func:`autobahn.wamp.interfaces.ITransport.isOpen`
        r�   N)r*   r�   r   r   r   r   r–   X  s   z WampRawSocketMixinGeneral.isOpenN)rW   rX   rY   rk   rR   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   sX   z|d u }| j  |¡ W n ty& } z| jjd|d� W Y d }~nd }~ww d | _ d S )Nz@WampRawSocketProtocol: ApplicationSession.onClose raised ({err})rv   )r�   ZonCloserz   r    rŽ   )r   r0   ZwasCleanry   r   r   r   r.   e  s   €þ
z-WampRawSocketMixinAsyncio._on_connection_lostc                 C   s   |   ¡ r| j ¡  dS tƒ ‚)zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.close`
        N)r–   r"   r5   r   r   r   r   r   r5   n  s   zWampRawSocketMixinAsyncio.closec                 C   s6   |   ¡ rt| jdƒr| j ¡  dS | j ¡  dS tƒ ‚)zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.abort`
        r�   N)r–   r*   r"   r�   r5   r   r   r   r   r   r�   w  s
   zWampRawSocketMixinAsyncio.abortN)rW   rX   rY   Ú__doc__r.   r5   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   sZ   || j jv rt | j j| ¡| _| jjd|d� dS | jjd|| j j ¡ d� |  ¡  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)rW   rX   rY   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)rW   rX   rY   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)	rW   rX   rY   r›   r%   r[   r    r   r¥   r   r   r   r   r¢   ²  s
    r¢   c                   @   ó   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u r!dd„ tƒ D ƒ}|s!t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 r2   r   r   ©r‹   r   r   Ú<lambda>Ö  ó    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«   rr   r   r   r   Ú
<dictcomp>à  s    z7WampRawSocketServerFactory.__init__.<locals>.<dictcomp>)ÚcallablerŒ   r
   rz   rž   )r   r‹   r�   r   r¨   r   ri   Ç  s   z#WampRawSocketServerFactory.__init__r2   )rW   rX   rY   r›   r   r£   ri   r   r   r   r   r   À  ó    r   c                   @   r¦   )r   z;
    asyncio-based WAMP-over-RawSocket client factory.
    Nc                    sT   t ˆ ƒrˆ | _n‡ fdd„| _|du rtƒ }|r|d ƒ }|du r%t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                      r§   r2   r   r   r¨   r   r   r©   ù  rª   z5WampRawSocketClientFactory.__init__.<locals>.<lambda>Nr   z$could not import any WAMP serializer)r®   rŒ   r
   rz   r“   )r   r‹   rœ   r�   r   r¨   r   ri   ê  s   

z#WampRawSocketClientFactory.__init__r2   )rW   rX   rY   r›   r   r£   ri   r   r   r   r   r   ã  r¯   r   )+Úasyncior;   rd   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__rQ   rS   rN   ro   ÚProtocolr   r`   rˆ   r{   rz   rp   r~   r„   Úobjectr‰   rš   r   r   r¢   r   r   r   r   r   r   Ú<module>   sL   s7û	A%"