Ë
    aQbj  ã                  ó  — d 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mZmZmZmZmZ ddlmZmZmZmZ dd	lmZ erdd
lmZ ddlmZ  G d„ de«      Z G d„ de«      Zej<                  Zej>                  Z G d„ d«      Z y)zU
wsproto/connection
~~~~~~~~~~~~~~~~~~

An implementation of a WebSocket connection.
é    )Úannotations)Údeque)ÚEnum)ÚTYPE_CHECKINGé   )ÚBytesMessageÚCloseConnectionÚEventÚMessageÚPingÚPongÚTextMessage)ÚCloseReasonÚFrameProtocolÚOpcodeÚParseFailed)ÚLocalProtocolError)Ú	Generator)Ú	Extensionc                  ó(   — e Zd ZdZdZdZdZdZdZdZ	y)	ÚConnectionStatez1
    RFC 6455, Section 4 - Opening Handshake
    r   r   é   é   é   é   N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú
CONNECTINGÚOPENÚREMOTE_CLOSINGÚLOCAL_CLOSINGÚCLOSEDÚ	REJECTING© ó    úE/var/www/html/venv/lib/python3.12/site-packages/wsproto/connection.pyr   r      s'   „ ñð
 €Jà€Dà€Nà€Mà€Fà�Ir'   r   c                  ó   — e Zd ZdZdZdZy)ÚConnectionTypez#An enumeration of connection types.r   r   N)r   r   r   r   ÚCLIENTÚSERVERr&   r'   r(   r*   r*   2   s   „ Ù-ð €Fð �Fr'   r*   c                  óV   — e Zd ZdZ	 	 d	 	 	 	 	 	 	 d	d„Zed
d„«       Zdd„Zdd„Zdd„Z	y)Ú
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.
    Nc                óÚ   — |t         j                  u | _        t        «       | _        t        | j                  |xs g «      | _        t        j                  | _	        | j                  |«       y)a   
        Constructor

        :param wsproto.connection.ConnectionType connection_type: Whether this
            object is on the client- or server-side of a connection.
            To initialise as a client pass ``CLIENT`` otherwise pass ``SERVER``.
        :param list extensions: The proposed extensions.
        :param bytes trailing_data: Data that has been received, but not yet
            processed.
        N)r*   r+   Úclientr   Ú_eventsr   Ú_protor   r!   Ú_stateÚreceive_data)ÚselfÚconnection_typeÚ
extensionsÚtrailing_datas       r(   Ú__init__zConnection.__init__I   sQ   € ð  &¬×)>Ñ)>Ð>ˆŒÜ%*£WˆŒÜ# D§K¡K°Ò1A¸rÓBˆŒÜ%×*Ñ*ˆŒØ×Ñ˜-Õ(r'   c                ó   — | j                   S )N)r3   )r5   s    r(   ÚstatezConnection.state_   s   € à�{‰{Ðr'   c                óÖ  — d}t        |t        «      rR| j                  t        j                  k(  r5|| j
                  j                  |j                  |j                  «      z  }|S t        |t        «      rG| j                  t        j                  k(  r*|| j
                  j                  |j                  «      z  }|S t        |t        «      rG| j                  t        j                  k(  r*|| j
                  j                  |j                  «      z  }|S t        |t        «      rª| j                  t        j                  t        j                  hv r~|| j
                  j!                  |j"                  |j$                  «      z  }| j                  t        j                  k(  rt        j&                  | _        |S t        j*                  | _        |S d|› d| j                  › d�}t-        |«      ‚)Nr'   zEvent z cannot be sent in state ú.)Ú
isinstancer   r;   r   r!   r2   Ú	send_dataÚdataÚmessage_finishedr   ÚpingÚpayloadr   Úpongr	   r"   ÚcloseÚcodeÚreasonr$   r3   r#   r   )r5   Úeventr@   Úmsgs       r(   ÚsendzConnection.sendc   s‹  € ØˆÜ�eœWÔ%¨$¯*©*¼×8LÑ8LÒ*LØ�D—K‘K×)Ñ)¨%¯*©*°e×6LÑ6LÓMÑMˆDð& ˆô% ˜œtÔ$¨¯©´×7KÑ7KÒ)KØ�D—K‘K×$Ñ$ U§]¡]Ó3Ñ3ˆDð" ˆô! ˜œtÔ$¨¯©´×7KÑ7KÒ)KØ�D—K‘K×$Ñ$ U§]¡]Ó3Ñ3ˆDð ˆô ˜œÔ/°D·J±JÜ× Ñ Ü×*Ñ*ðC
ñ 5
ð �D—K‘K×%Ñ% e§j¡j°%·,±,Ó?Ñ?ˆDØ�z‰zœ_×;Ñ;Ò;Ü-×4Ñ4�”ð ˆô .×;Ñ;�”ð ˆð	 ˜5˜'Ð!:¸4¿:¹:¸,ÀaÐHˆCÜ$Øóð r'   c                ó|  — |€I| j                   j                  t        t        j                  ¬«      «       t
        j                  | _        y| j                  t
        j                  t
        j                  fv r| j                  j                  |«       y| j                  t
        j                  u rd}t        |«      ‚y)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)rF   zConnection already closed.)r1   Úappendr	   r   ÚABNORMAL_CLOSUREr   r$   r3   r;   r!   r#   r2   Úreceive_bytesr   )r5   r@   rI   s      r(   r4   zConnection.receive_data{   sŒ   € ð ˆ<ð
 �L‰L×Ñ¤´[×5QÑ5QÔ RÔSÜ)×0Ñ0ˆDŒKØà�:‰:œ/×.Ñ.´×0MÑ0MÐNÑNØ�K‰K×%Ñ% dÕ+Ø�Z‰Zœ?×1Ñ1Ñ1Ø.ˆCÜ$ SÓ)Ð)àr'   c              #  óà  K  — | j                   r)| j                   j                  «       –— | j                   rŒ)	 | j                  j                  «       D �]^  }|j                  t
        j                  u rW|j                  sJ ‚|j                  sJ ‚t        |j                  t        t        f«      sJ ‚t        |j                  ¬«      –— Œw|j                  t
        j                  u rW|j                  sJ ‚|j                  sJ ‚t        |j                  t        t        f«      sJ ‚t        |j                  ¬«      –— Œê|j                  t
        j                   u rƒt        |j                  t"        «      sJ ‚|j                  \  }}| j$                  t&        j(                  u rt&        j*                  | _        nt&        j.                  | _        t1        ||¬«      –— �Œ‰|j                  t
        j2                  u rLt        |j                  t4        «      sJ ‚t7        |j                  |j                  |j                  ¬«      –— �Œñ|j                  t
        j8                  u rRt        |j                  t        t        f«      sJ ‚t;        |j                  |j                  |j                  ¬«      –— �Œ_�Œa y# t<        $ r,}t1        |j>                  t5        |«      ¬«      –— Y d}~yd}~ww xY w­w)zÅ
        Return a generator that provides any events that have been generated
        by protocol activity.

        :returns: generator of :class:`Event <wsproto.events.Event>` subclasses
        )rC   )rF   rG   )r@   Úframe_finishedrA   N) r1   Úpopleftr2   Úreceived_framesÚopcoder   ÚPINGrP   rA   r>   rC   ÚbytesÚ	bytearrayr   ÚPONGr   ÚCLOSEÚtupler;   r   r#   r$   r3   r"   r	   ÚTEXTÚstrr   ÚBINARYr   r   rF   )r5   ÚframerF   rG   Úexcs        r(   ÚeventszConnection.events–   s-  è ø€ ð �lŠlØ—,‘,×&Ñ&Ó(Ò(ð �l‹lð*	BØŸ™×4Ñ4Ó6ó '�Ø—<‘<¤6§;¡;Ñ.Ø ×/Ò/Ð/Ð/Ø ×1Ò1Ð1Ð1Ü% e§m¡m´e¼YÐ5GÔHÐHÐHÜ u§}¡}Ô5Ó5à—\‘\¤V§[¡[Ñ0Ø ×/Ò/Ð/Ð/Ø ×1Ò1Ð1Ð1Ü% e§m¡m´e¼YÐ5GÔHÐHÐHÜ u§}¡}Ô5Ó5à—\‘\¤V§\¡\Ñ1Ü% e§m¡m´UÔ;Ð;Ð;Ø#(§=¡=‘L�D˜&Ø—z‘z¤_×%BÑ%BÑBÜ&5×&<Ñ&<˜�ä&5×&DÑ&D˜œÜ)¨t¸FÔCÔCà—\‘\¤V§[¡[Ñ0Ü% e§m¡m´SÔ9Ð9Ð9Ü%Ø"Ÿ]™]Ø',×';Ñ';Ø).×)?Ñ)?ôô ð —\‘\¤V§]¡]Ñ2Ü% e§m¡m´e¼YÐ5GÔHÐHÐHÜ&Ø"Ÿ]™]Ø',×';Ñ';Ø).×)?Ñ)?ôô ñ ñO'øôP ò 	BÜ! s§x¡x¼¸C»ÔA×Aûð	Büs/   ‚5K.¹I<J6 Ê5K.Ê6	K+Ê?"K&Ë!K.Ë&K+Ë+K.)Nr'   )r6   r*   r7   zlist[Extension] | Noner8   rU   ÚreturnÚNone)r`   r   )rH   r
   r`   rU   )r@   zbytes | Noner`   ra   )r`   zGenerator[Event, None, None])
r   r   r   r   r9   Úpropertyr;   rJ   r4   r_   r&   r'   r(   r.   r.   @   s^   „ ñð .2Ø"ð	)à'ð)ð +ð)ð ð	)ð
 
ó)ð, òó ðóó0ô64Br'   r.   N)!r   Ú
__future__r   Úcollectionsr   Úenumr   Útypingr   r_   r   r	   r
   r   r   r   r   Úframe_protocolr   r   r   r   Ú	utilitiesr   Úcollections.abcr   r7   r   r   r*   r+   r,   r.   r&   r'   r(   ú<module>rj      sz   ðñõ #å Ý Ý  ÷÷ ñ ÷ LÓ KÝ )áÝ)å%ô�dô ô&�Tô ð 
×	Ñ	€Ø	×	Ñ	€÷JBò JBr'   