o
    >hKF                     @   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`
        )_transport_detailsself r   z/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/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	   CHANNEL_FRAMING_RAWSOCKET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   r1   r   r   r   r0   g      z"PrefixProtocol._on_connection_lostc                 C   s   | j | | j  d S r4   )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  r4   NotImplementedErrorr   rA   r   r   r   pingv      zPrefixProtocol.pingc                 C   rE   r4   rF   rH   r   r   r   pongy   rJ   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%   r:   prefix_lengthr&   ordFRAME_TYPE_PONGr9   r=   unpackr?   
max_lengthFRAME_TYPE_DATAstringReceivedFRAME_TYPE_PINGrI   rK   )r   rA   pos	remaining
frame_typeframe_lengthrC   r   r   r   data_received|   sB   









"zPrefixProtocol.data_receivedc                 C   rE   r4   rF   rH   r   r   r   rT      rJ   zPrefixProtocol.stringReceived)__name__
__module____qualname__r?   r=   calcsizerN   rR   r;   r'   make_loggerr    r   r   str__annotations__r   boolpropertyr	   r   r+   r/   r3   r0   r9   rD   rI   rK   rZ   rT   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<   rR   _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   rE   r4   rF   r   r   r   r   _on_handshake_complete   rJ   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   rf   r   re      zReserved bytes must be zero)	bytearrayr%   
MAGIC_BYTEHandshakeErrorr;   )r   bufserlexpr   r   r   parse_handshake   s   z!RawSocketProtocol.parse_handshakec                 C   rE   r4   rF   r   r   r   r   process_handshake   rJ   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})rA   rp   zHandshake error : {err}errTr   )r    r!   r   rn   r   rZ   r%   r:   ry   rt   r9   formatro   )r   rA   er   r   r   rZ      s(   
zRawSocketProtocol.data_receivedN)	r[   r\   r]   rm   r+   ro   rx   ry   rZ   r   r   r   r   rd      s    rd   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   rq   rp   c                   @   s   e Zd ZdddZdS )rt   r   c                 C   s,   t | |s
| d S |dt|   d S )Nz : %s)	Exceptionrm   ERRMAPget)r   r8   coder   r   r   rm      s   ,zHandshakeError.__init__N)r   )r[   r\   r]   rm   r   r   r   r   rt      s    rt   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   r5   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})rx   rt   serializer_idr|   )r   r   r{   r   r   r   ry      s   


z)RawSocketClientProtocol.process_handshakec                 C   rE   r4   rF   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 )Nrp   r   z(RawSocket Asyncio: Client handshake sent)
rd   r+   bytesrr   rs   rj   r   r@   r    r!   )r   r"   hsr   r   r   r+     s   
z'RawSocketClientProtocol.connection_madeN)	r[   r\   r]   r   r   ry   rc   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   rE   r4   rF   r   r   r   r   supports_serializer  rJ   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 )Nrp   rf   r   )r"   r@   r   rr   rs   )rw   r   b2r   r   r   send_response  s    z@RawSocketServerProtocol.process_handshake.<locals>.send_responser   z!Serializer unsupported : {ser_id})r   )rx   r   ERR_SERIALIZER_UNSUPPORTEDrt   r|   rj   )r   r   r   _lexpr   r   r   ry     s   

z)RawSocketServerProtocol.process_handshakeN)r[   r\   r]   r   r   ry   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})rz   zApplicationSession started.)r    r!   r   	is_securer   r"   r   
channel_idfactory_factory_sessiononOpenr~   warnabortinfo)r   r   r}   r   r   r   ro   !  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})r8   zHWampRawSocketProtocol: WAMP Protocol Error ({err}) - aborting connectionrz   zHWampRawSocketProtocol: WAMP Internal Error ({err}) - aborting connection)r    r!   r   _serializerunserializer   	onMessager   r   r   r~   )r   payloadr8   r}   r   r   r   rT   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})funcr8   zIWampRawSocketProtocol: unable to serialize WAMP application payload ({0})Nz*WampRawSocketProtocol: TX octets: {octets}r   )isOpenr    r!   r   sendr   	serializer~   r   r|   rD   r   r   )r   r8   r   _r}   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)r[   r\   r]   ro   rT   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})rz   )r   onCloser~   r    r   )r   r2   wasCleanr}   r   r   r   r0   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"   r7   r   r   r   r   r   r7   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   r7   r   r   r   r   r   r   w  s
   zWampRawSocketMixinAsyncio.abortN)r[   r\   r]   __doc__r0   r7   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}')
serializerTzWampRawSocketProtocol: 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)r[   r\   r]   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)r[   r\   r]   r   rc   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 r4   )protocolr   )r   protor   r   r   __call__  s   zWampRawSocketFactory.__call__N)	r[   r\   r]   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 r4   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   rv   r   r   r   
<dictcomp>  s    z7WampRawSocketServerFactory.__init__.<locals>.<dictcomp>)callabler   r
   r~   r   )r   r   r   r   r   r   rm     s   z#WampRawSocketServerFactory.__init__r4   )r[   r\   r]   r   r   r   rm   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   r4   r   r   r   r   r   r     r   z5WampRawSocketClientFactory.__init__.<locals>.<lambda>Nr   z$could not import any WAMP serializer)r   r   r
   r~   r   )r   r   r   r   r   r   r   rm     s   

z#WampRawSocketClientFactory.__init__r4   )r[   r\   r]   r   r   r   rm   r   r   r   r   r     r   r   )+asyncior=   rh   r   typingr   r'   autobahn.utilr   r   r   autobahn.wamp.exceptionr   r   r   autobahn.wamp.typesr	   autobahn.asyncio.utilr
   r   r   __all__rS   rU   rP   rs   Protocolr   rd   r   r   r~   rt   r   r   objectr   r   r   r   r   r   r   r   r   r   r   <module>   sL   s7	A%"