o
    @BiC                     @   s  d dl mZ zd dlZW n ey   d dlZY nw d dlZd dlZd dlZd dlm	Z	m
Z
 d dlmZmZmZ d dlmZmZ d dlZdZe  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 )(    )absolute_importN)public_LazyHexFormatter)ProtocolErrorSerializationErrorTransportLost)peer2strget_serializers)WampRawSocketServerProtocolWampRawSocketClientProtocolWampRawSocketServerFactoryWampRawSocketClientFactory         c                   @   s~   e Zd ZdZeeZdZeZe	
 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   c                 C   sF   || _ |d}t|| _| jjd| jd d| _d | _t	 | _
d S )Npeernamez3RawSocker Asyncio: Connection made with peer {peer})peer    )	transportget_extra_infor   r   logdebug_buffer_headertxaiocreate_future_wait_closed)selfr   r    r    Z/var/www/html/Trade-python/venv/lib/python3.10/site-packages/autobahn/asyncio/rawsocket.pyconnection_madeC   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_closedL   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_lostU   s   zPrefixProtocol.connection_lostc                 C   s   d S Nr    r(   r    r    r!   r'   [      z"PrefixProtocol._on_connection_lostc                 C   s   | j | | j  d S r+   )r   errorr   close)r   msgr    r    r!   protocol_error^   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!   
sendStringb   s   
zPrefixProtocol.sendStringc                 C      t  r+   NotImplementedErrorr   r8   r    r    r!   pingj      zPrefixProtocol.pingc                 C   r<   r+   r=   r?   r    r    r!   pongm   rA   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rd | _|| j7 }|| j8 }| j |||  }||7 }||8 }|tkr| | n|tkr| | n|tkr| | n||f| _n|| jks| j |d  | _ d S )Nr   r      zInvalid frame type    zFrame too big)r   r1   prefix_lengthr   ordFRAME_TYPE_PONGr0   r4   unpackr6   
max_lengthFRAME_TYPE_DATAstringReceivedFRAME_TYPE_PINGr@   rB   )r   r8   pos	remaining
frame_typeframe_lengthr:   r    r    r!   data_receivedp   sB   









"zPrefixProtocol.data_receivedc                 C   r<   r+   r=   r?   r    r    r!   rK      rA   zPrefixProtocol.stringReceivedN)__name__
__module____qualname__r6   r4   calcsizerE   rI   r2   r   make_loggerr   r"   propertyr&   r*   r'   r0   r;   r@   rB   rQ   rK   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	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   r3   rI   _length_exp)r   max_sizeexpr    r    r!   __init__   s   

zRawSocketProtocol.__init__c                 C   s   t | | d| _d S )NF)r   r"   _handshake_done)r   r   r    r    r!   r"      s   
z!RawSocketProtocol.connection_madec                 C   r<   r+   r=   r   r    r    r!   _on_handshake_complete   rA   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   rZ   r   rY      zReserved bytes must be zero)	bytearrayr   
MAGIC_BYTEHandshakeErrorr2   )r   bufserlexpr    r    r!   parse_handshake   s   z!RawSocketProtocol.parse_handshakec                 C   r<   r+   r=   rc   r    r    r!   process_handshake   rA   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})r8   re   zHandshake error : {err}errTr   )r   r   r   rb   r   rQ   r   r1   rn   ri   r0   formatrd   )r   r8   er    r    r!   rQ      s(   
zRawSocketProtocol.data_receivedN)	rR   rS   rT   ra   r"   rd   rm   rn   rQ   r    r    r    r!   rX      s    rX   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   rf   re   c                   @   s   e Zd ZdddZdS )ri   r   c                 C   s,   t | |s
| d S |dt|   d S )Nz : %s)	Exceptionra   ERRMAPget)r   r/   coder    r    r!   ra      s   ,zHandshakeError.__init__N)r   )rR   rS   rT   ra   r    r    r    r!   ri      s    ri   c                   @   s0   e Zd Zdd Zdd Zedd Zdd Zd	S )
RawSocketClientProtocolc                 C      dS )NTr    r   ser_idr    r    r!   check_serializer   r,   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})rm   ri   serializer_idrq   )r   rz   rp   r    r    r!   rn      s   


z)RawSocketClientProtocol.process_handshakec                 C   r<   r+   r=   rc   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 )Nre   r   z(RawSocket Asyncio: Client handshake sent)
rX   r"   bytesrg   rh   r^   r|   r7   r   r   )r   r   hsr    r    r!   r"      s   
z'RawSocketClientProtocol.connection_madeN)rR   rS   rT   r{   rn   rW   r|   r"   r    r    r    r!   rw      s    
rw   c                   @   s   e Zd Zdd Zdd ZdS )RawSocketServerProtocolc                 C   r<   r+   r=   ry   r    r    r!   supports_serializer  rA   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 )Nre   rZ   r   )r   r7   r}   rg   rh   )rl   rz   b2rc   r    r!   send_response  s    z@RawSocketServerProtocol.process_handshake.<locals>.send_responser   z!Serializer unsupported : {ser_id})rz   )rm   r   ERR_SERIALIZER_UNSUPPORTEDri   rq   r^   )r   r   rz   _lexpr    rc   r!   rn     s   

z)RawSocketServerProtocol.process_handshakeN)rR   rS   rT   r   rn   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   sx   | j d z| j | _| j|  W n ty3 } z| j jd|d |   W Y d }~d S d }~ww | j 	d d S )Nz)WampRawSocketProtocol: Handshake completezMWampRawSocketProtocol: ApplicationSession constructor / onOpen raised ({err})ro   zApplicationSession started.)
r   r   factory_factory_sessiononOpenrs   warnabortinfo)r   rr   r    r    r!   rd     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}r/   zHWampRawSocketProtocol: WAMP Protocol Error ({err}) - aborting connectionro   zHWampRawSocketProtocol: WAMP Internal Error ({err}) - aborting connection)r   r   r   _serializerunserializer   	onMessager   r   r   rs   )r   payloadr/   rr   r    r    r!   rK     s   z(WampRawSocketMixinGeneral.stringReceivedc              
   C   s|   |   r;| jjd|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-WampRawSocketProtocol: TX WAMP message: {msg}r   zIWampRawSocketProtocol: unable to serialize WAMP application payload ({0})Nz*WampRawSocketProtocol: TX octets: {octets}r   )isOpenr   r   r   	serializers   r   rq   r;   r   r   )r   r/   r   _rr   r    r    r!   send-  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   rc   r    r    r!   r   ?  s   z WampRawSocketMixinGeneral.isOpenN)rR   rS   rT   rd   rK   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})ro   )r   onClosers   r   r   )r   r)   wasCleanrr   r    r    r!   r'   L  s   
z-WampRawSocketMixinAsyncio._on_connection_lostc                 C   s   |   r| j  dS t )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.close`
        N)r   r   r.   r   rc   r    r    r!   r.   U  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   r.   r   rc   r    r    r!   r   ^  s
   zWampRawSocketMixinAsyncio.abortN)rR   rS   rT   __doc__r'   r.   r   r    r    r    r!   r   G  s
    		r   c                   @   s"   e Zd ZdZdd Zd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}')
serializerTzWampRawSocketProtocol: opening handshake - no suitable serializer found (client requested {serializer}, and we have {serializers})r   serializersF)r   _serializerscopyr   r   r   keysr   ry   r    r    r!   r   v  s   
z/WampRawSocketServerProtocol.supports_serializer
tls-uniquec                 C   rx   zW
        Implements :func:`autobahn.wamp.interfaces.ITransport.get_channel_id`
        Nr    r   channel_id_typer    r    r!   get_channel_id     z*WampRawSocketServerProtocol.get_channel_idNr   )rR   rS   rT   r   r   r   r    r    r    r!   r
   l  s    r
   c                   @   s&   e Zd ZdZedd Zd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_IDrc   r    r    r!   r|     s   
z)WampRawSocketClientProtocol.serializer_idr   c                 C   rx   r   r    r   r    r    r!   r     r   z*WampRawSocketClientProtocol.get_channel_idNr   )rR   rS   rT   r   rW   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 r+   )protocolr   )r   protor    r    r!   __call__  s   zWampRawSocketFactory.__call__N)	rR   rS   rT   r   r   rV   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                    sL   t  r | _n fdd| _|du rt }|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 r+   r    r    r   r    r!   <lambda>      z5WampRawSocketServerFactory.__init__.<locals>.<lambda>Nz%could not import any WAMP serializersc                 S   s   i | ]}|j |qS r    )r   ).0rk   r    r    r!   
<dictcomp>  s    z7WampRawSocketServerFactory.__init__.<locals>.<dictcomp>)callabler   r	   rs   r   )r   r   r   r    r   r!   ra     s   z#WampRawSocketServerFactory.__init__r+   )rR   rS   rT   r   r
   r   ra   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   r+   r    r    r   r    r!   r     r   z5WampRawSocketClientFactory.__init__.<locals>.<lambda>Nr   z$could not import any WAMP serializer)r   r   r	   rs   r   )r   r   r   r   r    r   r!   ra     s   

z#WampRawSocketClientFactory.__init__r+   )rR   rS   rT   r   r   r   ra   r    r    r    r!   r     r   r   )*
__future__r   asyncioImportErrortrolliusr4   r\   r   autobahn.utilr   r   autobahn.wamp.exceptionr   r   r   autobahn.asyncio.utilr   r	   r   __all__use_asynciorJ   rL   rG   rh   Protocolr   rX   r   rt   rs   ri   rw   r   objectr   r   r
   r   r   r   r   r    r    r    r!   <module>   sT   a8	7%""