U
    )–€h�  ã                   @   sÆ   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 ddl
mZmZmZmZmZ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 G d
d„ deƒZG dd„ deƒZejZejZG dd„ dƒZdS )zU
wsproto/connection
~~~~~~~~~~~~~~~~~~

An implementation of a WebSocket connection.
é    )Údeque)ÚEnum)ÚDequeÚ	GeneratorÚListÚOptionalé   )ÚBytesMessageÚCloseConnectionÚEventÚMessageÚPingÚPongÚTextMessage)Ú	Extension)ÚCloseReasonÚFrameProtocolÚOpcodeÚParseFailed)ÚLocalProtocolErrorc                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	ÚConnectionStatez1
    RFC 6455, Section 4 - Opening Handshake
    r   r   é   é   é   é   N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z
CONNECTINGÚOPENÚREMOTE_CLOSINGÚLOCAL_CLOSINGÚCLOSEDZ	REJECTING© r#   r#   ú6/tmp/pip-unpacked-wheel-apvau60e/wsproto/connection.pyr      s   r   c                   @   s   e Zd ZdZdZdZdS )ÚConnectionTypez#An enumeration of connection types.r   r   N)r   r   r   r   ÚCLIENTÚSERVERr#   r#   r#   r$   r%   -   s   r%   c                   @   s|   e Zd ZdZdeeee  eddœdd„Z	e
edœdd	„ƒZeed
œdd„Zee ddœdd„Zeeddf dœdd„ZdS )Ú
Connectionaä  
    A low-level WebSocket connection object.

    This wraps two other protocol objects, an HTTP/1.1 protocol object used
    to do the initial HTTP upgrade handshake and a WebSocket frame protocol
    object used to exchange messages and other control frames.

    :param conn_type: Whether this object is on the client- or server-side of
        a connection. To initialise as a client pass ``CLIENT`` otherwise
        pass ``SERVER``.
    :type conn_type: ``ConnectionType``
    Nó    )Úconnection_typeÚ
extensionsÚtrailing_dataÚreturnc                 C   s<   |t jk| _tƒ | _t| j|p g ƒ| _tj| _	|  
|¡ d S ©N)r%   r&   Úclientr   Ú_eventsr   Ú_protor   r   Ú_stateÚreceive_data)Úselfr*   r+   r,   r#   r#   r$   Ú__init__I   s
    zConnection.__init__)r-   c                 C   s   | j S r.   )r2   )r4   r#   r#   r$   ÚstateU   s    zConnection.state)Úeventr-   c                 C   sô   d}t |tƒr2| jtjkr2|| j |j|j¡7 }n¾t |t	ƒr\| jtjkr\|| j 
|j¡7 }n”t |tƒr†| jtjkr†|| j |j¡7 }njt |tƒrØ| jtjtjhkrØ|| j |j|j¡7 }| jtjkrÎtj| _qðtj| _ntd|› d| j› d�ƒ‚|S )Nr)   zEvent z cannot be sent in state Ú.)Ú
isinstancer   r6   r   r   r1   Z	send_dataÚdataÚmessage_finishedr   ZpingÚpayloadr   Zpongr
   r    ÚcloseÚcodeÚreasonr"   r2   r!   r   )r4   r7   r:   r#   r#   r$   ÚsendY   s&    þ

ÿzConnection.send)r:   r-   c                 C   sb   |dkr(| j  ttjd�¡ tj| _dS | jtj	tj
fkrH| j |¡ n| jtjkr^tdƒ‚n dS )aO  
        Pass some received data to the connection for handling.

        A list of events that the remote peer triggered by sending this data can
        be retrieved with :meth:`~wsproto.connection.Connection.events`.

        :param data: The data received from the remote peer on the network.
        :type data: ``bytes``
        N)r>   zConnection already closed.)r0   Úappendr
   r   ZABNORMAL_CLOSUREr   r"   r2   r6   r   r!   r1   Zreceive_bytesr   )r4   r:   r#   r#   r$   r3   p   s    
zConnection.receive_datac              
   c   s°  | j r| j  ¡ V  q �z\| j ¡ D �]J}|jtjkrh|jr@|jsDt	‚t
|jttfƒsXt	‚t|jd�V  q"|jtjkr¨|jr€|js„t	‚t
|jttfƒs˜t	‚t|jd�V  q"|jtjkrüt
|jtƒsÄt	‚|j\}}| jtjkrätj| _ntj| _t||d�V  q"|jtjk�r4t
|jtƒ�st	‚t|j|j|jd�V  q"|jtjkr"t
|jttfƒ�sVt	‚t|j|j|jd�V  q"q"W n8 tk
�rª } zt|j t|ƒd�V  W 5 d}~X Y nX dS )zÅ
        Return a generator that provides any events that have been generated
        by protocol activity.

        :returns: generator of :class:`Event <wsproto.events.Event>` subclasses
        )r<   )r>   r?   )r:   Úframe_finishedr;   N)!r0   Úpopleftr1   Zreceived_framesÚopcoder   ZPINGrB   r;   ÚAssertionErrorr9   r<   ÚbytesÚ	bytearrayr   ZPONGr   ZCLOSEÚtupler6   r   r!   r"   r2   r    r
   ZTEXTÚstrr   ZBINARYr	   r   r>   )r4   Úframer>   r?   Úexcr#   r#   r$   Úevents‹   sH    

ý
ý
zConnection.events)Nr)   )r   r   r   r   r%   r   r   r   rF   r5   Úpropertyr   r6   r   r@   r3   r   rL   r#   r#   r#   r$   r(   ;   s     ü
ûr(   N) r   Úcollectionsr   Úenumr   Útypingr   r   r   r   rL   r	   r
   r   r   r   r   r   r+   r   Zframe_protocolr   r   r   r   Z	utilitiesr   r   r%   r&   r'   r(   r#   r#   r#   r$   Ú<module>   s   $	
