o
    >h^                     @   s  d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZmZ d dlmZmZ d d	lmZ d d
lmZmZmZmZ d dlmZ dZG dd deZeG dd deZeG dd d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)Factory)Int32StringReceiver)ConnectionDone)CancelledError)public_LazyHexFormatter)create_transport_detailstransport_channel_id)TransportDetails)ProtocolErrorSerializationErrorTransportLostInvalidUriError)PayloadExceededError)WampRawSocketServerProtocolWampRawSocketClientProtocolWampRawSocketServerFactoryWampRawSocketClientFactoryc                   @   s   e Zd ZU dZe ZdZee	 e
d< dZee e
d< dd Zedee f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d ZdS )WampRawSocketProtocolzE
    Base class for Twisted-based WAMP-over-RawSocket protocols.
    Npeer	is_serverc                 C   s   d| _ d | _d S N   )_max_message_size_transport_detailsself r   z/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/autobahn/twisted/rawsocket.py__init__=   s   
zWampRawSocketProtocol.__init__returnc                 C   s   | j S )zZ
        Implements :func:`autobahn.wamp.interfaces.ITransport.transport_details`
        )r   r   r   r   r   transport_detailsB   s   z'WampRawSocketProtocol.transport_detailsc                 C   s   d || j}t|)NzqRawSocket connection: length of received message exceeded (message was {} bytes, but current maximum is {} bytes))format
MAX_LENGTHr   )r   lengthemsgr   r   r   lengthLimitExceededI   s   z)WampRawSocketProtocol.lengthLimitExceededc                 C   sP   t | j| j| _tj| j_| jj| _t	 | _
d | _d | _d| _d| _d | _d S )NF    )r	   	transportr   r   r   CHANNEL_FRAMING_RAWSOCKETchannel_framingr   txaiocreate_future	is_closed_session_serializer_handshake_complete_handshake_bytes_max_len_sendr   r   r   r   connectionMadeO   s   



z$WampRawSocketProtocol.connectionMadec              
   C   s   z0| j jrdt| j| j jdi}|| j _| j | _| j	j
d| j| jj| jjd | j| }W n" tyR } z| j	jd| jj|d |   W Y d }~d S d }~ww | j	j
d| jj| j|d d S )Nz
tls-uniquez2{klass}._on_handshake_complete(): calling {method})sessionklassmethodzX{klass}._on_handshake_complete(): ApplicationSession constructor / onOpen raised ({err})r6   errz@{klass}._on_handshake_complete(): {session} started (res={res}).)r6   r5   res)r   	is_securer
   r)   r   
channel_idfactory_factoryr/   logdebug	__class____name__onOpen	Exceptionwarnabort)r   r<   r:   er   r   r   _on_handshake_completes   s(   
z,WampRawSocketProtocol._on_handshake_completec              
   C   s   | j jd| jj|d t| j|  zt|jt	}| j
r"| j
| W n ty@ } z| j jd| jj|d W Y d }~nd }~ww d | _
d S )Nz({klass}.connectionLost(reason="{reason}")r6   reasonzC{klass}.connectionLost(): ApplicationSession.onClose raised "{err}"r8   )r?   r@   rA   rB   r,   resolver.   
isinstancevaluer   r/   onCloserD   rE   )r   rI   wasCleanrG   r   r   r   connectionLost   s   
z$WampRawSocketProtocol.connectionLostc              
   C   s  | j jd| jjt|d z| j|D ]}| j jd| jj|d | j| qW d S  t	yH } z| j j
d| jj|d W Y d }~d S d }~w tyi } z| j jd| jj|d |   W Y d }~d S d }~w ty } z| j jd| jj|d |   W Y d }~d S d }~w ty } z| j jd	| jj|d |   W Y d }~d S d }~w ty } z| j jd
| jj|d |   W Y d }~d S d }~w ty } z| j   | j jd| jj|d |   W Y d }~d S d }~ww )Nz,{klass}.stringReceived(): RX {octets} octetsr6   octetsz.{klass}.stringReceived: RX WAMP message: {msg})r6   msgzM{klass}.stringReceived: WAMP CancelledError - connection will continue!
{err}r8   zI{klass}.stringReceived: WAMP InvalidUriError - aborting connection!
{err}zG{klass}.stringReceived: WAMP ProtocolError - aborting connection!
{err}zN{klass}.stringReceived: WAMP PayloadExceededError - aborting connection!
{err}zL{klass}.stringReceived: WAMP SerializationError - aborting connection!
{err}zC{klass}.stringReceived: WAMP Exception - aborting connection!
{err})r?   tracerA   rB   r   r0   unserializer/   	onMessager   r@   r   rE   rF   r   r   r   rD   failure)r   payloadrR   rG   r   r   r   stringReceived   sj   
z$WampRawSocketProtocol.stringReceivedc              
   C   s   |   re| jjd| jj|| jd z
| j|\}}W n ty. } ztd|d}~ww t	|}d| j
  k r>|k rQn nd|| j
}| j| t|| | | jjd| jjt|d dS t )	zM
        Implements :func:`autobahn.wamp.interfaces.ITransport.send`
        zB{klass}.send() (serializer={serializer}): TX WAMP message: "{msg}")r6   rR   
serializerzIWampRawSocketProtocol: unable to serialize WAMP application payload ({0})Nr   zQtried to send RawSocket message with size {} exceeding payload limit of {} octetsz"{klass}.send(): TX {octets} octetsrP   )isOpenr?   rS   rA   rB   r0   	serializer   r#   lenr3   rE   r   
sendStringr   r   )r   rR   rW   _rG   payload_lenr&   r   r   r   send   s,   

zWampRawSocketProtocol.sendc                 C   s
   | j duS )zO
        Implements :func:`autobahn.wamp.interfaces.ITransport.isOpen`
        N)r/   r   r   r   r   rZ      s   
zWampRawSocketProtocol.isOpenc                 C   s   |   r| j  dS t )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.close`
        N)rZ   r)   loseConnectionr   r   r   r   r   close   s   zWampRawSocketProtocol.closec                 C   s6   |   rt| jdr| j  dS | j  dS t )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.abort`
        abortConnectionN)rZ   hasattrr)   rc   ra   r   r   r   r   r   rF      s
   zWampRawSocketProtocol.abort)rB   
__module____qualname____doc__r,   make_loggerr?   r   r   str__annotations__r   boolr    propertyr   r"   r'   r4   rH   rO   rX   r`   rZ   rb   rF   r   r   r   r   r   4   s"   
 $-	r   c                   @   s   e Zd ZdZdd ZdS )r   z
    Twisted-based WAMP-over-RawSocket server protocol.

    Implements:

        * :class:`autobahn.wamp.interfaces.ITransport`
    c                 C   s  | j rt| | d S dt| j }|  j|d | 7  _t| jdkr| jjdt| jd t| jdd }|dkrI| jj	d|d | 
  n| jd	 d
dt| jdd
 d?   | _| jjd| jd t| jdd
 d@ }|| jjv rt| jj| | _| jjd|d n| jj	d|| jj d | 
  ttt| jd
}d
| | _tt|d d> | jjB g}| jd | j| | jd d| _ |   | jjd| jd ||d  }|r| | d S d S )N   zDWampRawSocketServerProtocol: opening handshake received - 0x{octets})rQ   r         zmWampRawSocketServerProtocol: invalid magic byte (octet 1) in opening handshake: was {magic}, but expected 127magicz8WampRawSocketServerProtocol: correct magic byte received   	   z^WampRawSocketServerProtocol: client requests us to send out most {max_bytes} bytes per message)	max_bytes   zJWampRawSocketServerProtocol: client wants to use serializer '{serializer}'rY   zWampRawSocketServerProtocol: opening handshake - no suitable serializer found (client requested {serializer}, and we have {serializers}rY   serializers        TzFWampRawSocketServerProtocol: opening handshake completed: {serializer})r1   r   dataReceivedr\   r2   r?   r@   r   ordrE   rF   r3   r=   _serializerscopyr0   keysintmathceilr   r$   bytes	bytearrayRAWSOCKET_SERIALIZER_IDr)   writerH   )r   data	remaining_magicser_idreply_max_len_expreply_octet2r   r   r   r{     sj   
 

z(WampRawSocketServerProtocol.dataReceivedN)rB   re   rf   rg   r{   r   r   r   r   r      s    r   c                   @   s    e Zd ZdZdd Zdd ZdS )r   z
    Twisted-based WAMP-over-RawSocket client protocol.

    Implements:

        * :class:`autobahn.wamp.interfaces.ITransport`
    c                 C   s   t |  t| jj| _ttt| j	d}d| | _
tt|d d> | jjB g}| jd | j| | jd d S )Nrr   rs   rm   ry   rz   )r   r4   r~   r=   r0   r   r   r   r?   r   r$   r   r   r   r)   r   )r   request_max_len_exprequest_octet2r   r   r   r4   f  s   

z*WampRawSocketClientProtocol.connectionMadec                 C   sJ  | j rt| | d S dt| j }|  j|d | 7  _t| jdkr| jjdt| jd t| jdd dkrK| jjdt| jd d | 	  d	d
t| jdd	 d?   | _
| jjd| j
d t| jdd	 d@ }|| jjkr| jjd|| jjd | 	  d| _ |   | jjd| jd ||d  }|r| | d S d S )Nrm   zEWampRawSocketClientProtocol: opening handshake received - {handshake})	handshaker   rn   ro   zpWampRawSocketClientProtocol: invalid magic byte (octet 1) in opening handshake: was 0x{magic}, but expected 0x7frp   rr   rs   zXWampRawSocketClientProtocol: server requests us to send out most {max} bytes per message)maxru   zWampRawSocketClientProtocol: opening handshake - no suitable serializer found (server replied {serializer}, and we requested {serializers})rw   TzXWampRawSocketClientProtocol: opening handshake completed (using serializer {serializer})rv   )r1   r   r{   r\   r2   r?   r@   r   r|   rF   r3   r0   r   errorrH   )r   r   r   r   r   r   r   r{   y  sL    z(WampRawSocketClientProtocol.dataReceivedN)rB   re   rf   rg   r4   r{   r   r   r   r   r   \  s    r   c                   @   s:   e Zd ZdZe Zdd Zdd ZdddZ	d	d
 Z
dS )WampRawSocketFactoryzE
    Base class for Twisted-based WAMP-over-RawSocket factories.
    c                    s(   t  r | _n fdd| _d| _dS )z

        :param factory: A callable that produces instances that implement
            :class:`autobahn.wamp.interfaces.ITransportHandler`
        :type factory: callable
        c                      s    S Nr   r   r=   r   r   <lambda>  s    z/WampRawSocketFactory.__init__.<locals>.<lambda>r   N)callabler>   r   )r   r=   r   r   r   r      s   
zWampRawSocketFactory.__init__c                 C   s
   d| _ d S r   )r   r   r   r   r   resetProtocolOptions  s   
z)WampRawSocketFactory.resetProtocolOptionsNc                 C   sb   | j jd| jj|d |d u st|tkr|dkr|dksJ |d ur-|| jkr/|| _d S d S d S )NzI{klass}.setProtocolOptions(maxMessagePayloadSize={maxMessagePayloadSize}))r6   maxMessagePayloadSizei   r   )r?   r@   rA   rB   typer   r   )r   r   r   r   r   setProtocolOptions  s   (
z'WampRawSocketFactory.setProtocolOptionsc                 C   sV   | j jd| jj|d |  }| |_| j|_| j|_| j jd| jj||j|jd |S )Nz"{klass}.buildProtocol(addr={addr}))r6   addrzf{klass}.buildProtocol() -> proto={proto}, max_message_size={max_message_size}, MAX_LENGTH={MAX_LENGTH})r6   protomax_message_sizer$   )r?   r@   rA   rB   protocolr=   r   r$   )r   r   pr   r   r   buildProtocol  s   z"WampRawSocketFactory.buildProtocolr   )rB   re   rf   rg   r,   rh   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
    Twisted-based WAMP-over-RawSocket server protocol factory.
    Nc                 C   sD  t | | |du rg }zddlm} ||dd ||  W n	 ty+   Y nw zddlm} ||dd ||  W n	 tyK   Y nw zddlm} ||dd ||  W n	 tyk   Y nw zddlm} ||dd ||  W n	 ty   Y nw |st	d	i | _
|D ]}|| j
|j< qd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`
        Nr   CBORSerializerT)batchedMsgPackSerializerUBJSONSerializerJsonSerializerz%could not import any WAMP serializers)r   r    autobahn.wamp.serializerr   appendImportErrorr   r   r   rD   r}   r   )r   r=   rx   r   r   r   r   serr   r   r   r      sJ   z#WampRawSocketServerFactory.__init__r   )rB   re   rf   rg   r   r   r    r   r   r   r   r         r   c                   @   r   )r   zD
    Twisted-based WAMP-over-RawSocket client protocol factory.
    Nc                 C   s   t | | d| _|du r"zddlm} | }W n	 ty!   Y nw |du r;zddlm} | }W n	 ty:   Y nw |du rTzddlm} | }W n	 tyS   Y nw |du rmzddlm} | }W n	 tyl   Y nw |du rut	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`
        FNr   r   r   r   r   z$could not import any WAMP serializer)r   r    noisyr   r   r   r   r   r   rD   r0   )r   r=   rY   r   r   r   r   r   r   r   r    %  sB   




z#WampRawSocketClientFactory.__init__r   )rB   re   rf   rg   r   r   r    r   r   r   r   r     r   r   )#r~   r   typingr   r,   twisted.internet.protocolr   twisted.protocols.basicr   twisted.internet.errorr   twisted.internet.deferr   autobahn.utilr   r   autobahn.twisted.utilr	   r
   autobahn.wamp.typesr   autobahn.wamp.exceptionr   r   r   r   autobahn.exceptionr   __all__r   r   r   r   r   r   r   r   r   r   <module>   s2    J^U*@