Ë
    RPf,  ã                  óŒ  — d dl mZ d dlZd dlZd dlZd dlmZmZmZm	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 dd
lmZ ddlm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" ddl#m$Z$ g d¢Z% G d„ de"«      Z&dddddddddedddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Z'	 	 d	 	 	 	 	 	 	 dd„Z(y)é    )ÚannotationsN)ÚAnyÚOptionalÚSequenceÚTypeé   )ÚClientProtocol)ÚHeadersLike)ÚClientExtensionFactory)Ú enable_client_permessage_deflate)Úvalidate_subprotocols)Ú
USER_AGENT)ÚResponse)Ú
CONNECTINGÚOPENÚEvent)Ú
LoggerLikeÚOriginÚSubprotocol)Ú	parse_urié   )Ú
Connection)ÚDeadline)ÚconnectÚunix_connectÚClientConnectionc                  ón   ‡ — e Zd ZdZddœ	 	 	 	 	 	 	 d	ˆ fd„Zdedf	 	 	 	 	 	 	 d
d„Zdˆ fd„Zdˆ fd„Zˆ xZ	S )r   aá  
    Threaded implementation of a WebSocket client connection.

    :class:`ClientConnection` provides :meth:`recv` and :meth:`send` methods for
    receiving and sending messages.

    It supports iteration to receive messages::

        for message in websocket:
            process(message)

    The iterator exits normally when the connection is closed with close code
    1000 (OK) or 1001 (going away) or without a close code. It raises a
    :exc:`~websockets.exceptions.ConnectionClosedError` when the connection is
    closed with any other code.

    Args:
        socket: Socket connected to a WebSocket server.
        protocol: Sans-I/O connection.
        close_timeout: Timeout for closing the connection in seconds.

    é
   ©Úclose_timeoutc               ó`   •— |  t        j                  «       | _        t        ‰| �  |||¬«       y )Nr   )Ú	threadingr   Úresponse_rcvdÚsuperÚ__init__)ÚselfÚsocketÚprotocolr    Ú	__class__s       €úP/var/www/fastapitest/venv/lib/python3.12/site-packages/websockets/sync/client.pyr%   zClientConnection.__init__1   s2   ø€ ñ 	Ü&Ÿ_™_Ó.ˆÔÜ‰ÑØØØ'ð 	õ 	
ó    Nc                ó¸  — | j                  t        ¬«      5  | j                  j                  «       | _        |�%| j                  j
                  j                  |«       |�|| j                  j
                  d<   | j                  j                  | j                  «       ddd«       | j                  j                  |«      s5| j                  «        | j                  j                  «        t        d«      ‚| j                  €5| j                  «        | j                  j                  «        t        d«      ‚| j                  j                   t"        urO| j                  j                  | j$                  «       | j                  «        | j                  j                  «        | j                  j&                  �| j                  j&                  ‚y# 1 sw Y   �Œ3xY w)z1
        Perform the opening handshake.

        )Úexpected_stateNz
User-Agentztimed out during handshakez"connection closed during handshake)Úsend_contextr   r(   r   ÚrequestÚheadersÚupdateÚsend_requestr#   ÚwaitÚclose_socketÚrecv_events_threadÚjoinÚTimeoutErrorÚresponseÚConnectionErrorÚstater   r    Úhandshake_exc)r&   Úadditional_headersÚuser_agent_headerÚtimeouts       r*   Ú	handshakezClientConnection.handshake@   sp  € ð ×Ñ¬jÐÓ9ñ 	5ØŸ=™=×0Ñ0Ó2ˆDŒLØ!Ð-Ø—‘×$Ñ$×+Ñ+Ð,>Ô?Ø Ð,Ø5F�—‘×$Ñ$ \Ñ2Ø�M‰M×&Ñ& t§|¡|Ô4÷	5ð ×!Ñ!×&Ñ& wÔ/Ø×ÑÔØ×#Ñ#×(Ñ(Ô*ÜÐ;Ó<Ð<à�=‰=Ð Ø×ÑÔØ×#Ñ#×(Ñ(Ô*Ü!Ð"FÓGÐGà�=‰=×Ñ¤dÑ*Ø×#Ñ#×(Ñ(¨×);Ñ);Ô<Ø×ÑÔØ×#Ñ#×(Ñ(Ô*à�=‰=×&Ñ&Ð2Ø—-‘-×-Ñ-Ð-ð 3÷/	5ñ 	5ús   —BGÇGc                ó¤   •— | j                   €4t        |t        «      sJ ‚|| _         | j                  j	                  «        yt
        ‰| �  |«       y)z.
        Process one incoming event.

        N)r8   Ú
isinstancer   r#   Úsetr$   Úprocess_event)r&   Úeventr)   s     €r*   rC   zClientConnection.process_eventd   sG   ø€ ð �=‰=Ð Ü˜e¤XÔ.Ð.Ð.Ø!ˆDŒMØ×Ñ×"Ñ"Õ$ô ‰GÑ! %Õ(r+   c                ó–   •— 	 t         ‰| �  «        | j                  j                  «        y# | j                  j                  «        w xY w)zI
        Read incoming data from the socket and process events.

        N)r$   Úrecv_eventsr#   rB   )r&   r)   s    €r*   rF   zClientConnection.recv_eventsr   s:   ø€ ð
	%Ü‰GÑÔ!ð ×Ñ×"Ñ"Õ$øˆD×Ñ×"Ñ"Õ$ús	   ƒ, ¬A)r'   zsocket.socketr(   r	   r    úOptional[float]ÚreturnÚNone)r<   úOptional[HeadersLike]r=   úOptional[str]r>   rG   rH   rI   )rD   r   rH   rI   )rH   rI   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   r   r?   rC   rF   Ú__classcell__)r)   s   @r*   r   r      s~   ø„ ñð8 *,ñ
àð
ð !ð
ð
 'ð
ð 
õ
ð" 59Ø+5Ø#'ð	".à1ð".ð )ð".ð !ð	".ð
 
ó".õH)÷	%ñ 	%r+   r   FÚdeflater   i   )ÚsockÚssl_contextÚserver_hostnameÚunixÚpathÚoriginÚ
extensionsÚsubprotocolsr<   r=   ÚcompressionÚopen_timeoutr    Úmax_sizeÚloggerÚcreate_connectionc          	     ó’  — t        | «      }|j                  s|�t        d«      ‚|r|€|€t        d«      ‚|�|�t        d«      ‚|�J ‚|�t        |«       |dk(  rt	        |«      }n|�t        d|› �«      ‚t        |«      }|€t        }	 |€´|rgt        j                  t        j                  t        j                  «      }|j                  |j                  «       «       |€J ‚|j                  |«       n:t        j                  |j                  |j                   f|j                  «       «      }|j                  d«       |s/|j#                  t        j$                  t        j&                  d«       |j                  rg|€t)        j*                  «       }|€|j                  }|j                  |j                  «       «       |j-                  ||¬«      }|j                  d«       t/        ||||t0        ||¬	«      } ||||¬
«      }|j3                  |	|
|j                  «       «       |S # t4        $ r |�|j7                  «        ‚ w xY w)a)
  
    Connect to the WebSocket server at ``uri``.

    This function returns a :class:`ClientConnection` instance, which you can
    use to send and receive messages.

    :func:`connect` may be used as a context manager::

        async with websockets.sync.client.connect(...) as websocket:
            ...

    The connection is closed automatically when exiting the context.

    Args:
        uri: URI of the WebSocket server.
        sock: Preexisting TCP socket. ``sock`` overrides the host and port
            from ``uri``. You may call :func:`socket.create_connection` to
            create a suitable TCP socket.
        ssl_context: Configuration for enabling TLS on the connection.
        server_hostname: Host name for the TLS handshake. ``server_hostname``
            overrides the host name from ``uri``.
        origin: Value of the ``Origin`` header, for servers that require it.
        extensions: List of supported extensions, in order in which they
            should be negotiated and run.
        subprotocols: List of supported subprotocols, in order of decreasing
            preference.
        additional_headers (HeadersLike | None): Arbitrary HTTP headers to add
            to the handshake request.
        user_agent_header: Value of  the ``User-Agent`` request header.
            It defaults to ``"Python/x.y.z websockets/X.Y"``.
            Setting it to :obj:`None` removes the header.
        compression: The "permessage-deflate" extension is enabled by default.
            Set ``compression`` to :obj:`None` to disable it. See the
            :doc:`compression guide <../../topics/compression>` for details.
        open_timeout: Timeout for opening the connection in seconds.
            :obj:`None` disables the timeout.
        close_timeout: Timeout for closing the connection in seconds.
            :obj:`None` disables the timeout.
        max_size: Maximum size of incoming messages in bytes.
            :obj:`None` disables the limit.
        logger: Logger for this client.
            It defaults to ``logging.getLogger("websockets.client")``.
            See the :doc:`logging guide <../../topics/logging>` for details.
        create_connection: Factory for the :class:`ClientConnection` managing
            the connection. Set it to a wrapper or a subclass to customize
            connection handling.

    Raises:
        InvalidURI: If ``uri`` isn't a valid WebSocket URI.
        OSError: If the TCP connection fails.
        InvalidHandshake: If the opening handshake fails.
        TimeoutError: If the opening handshake times out.

    Nz5ssl_context argument is incompatible with a ws:// URIzmissing path argumentz(path and sock arguments are incompatiblerQ   zunsupported compression: T)rT   )rW   rX   rY   r:   r\   r]   r   )r   ÚsecureÚ	TypeErrorr   r   Ú
ValueErrorr   r   r'   ÚAF_UNIXÚSOCK_STREAMÚ
settimeoutr>   r   r^   ÚhostÚportÚ
setsockoptÚIPPROTO_TCPÚTCP_NODELAYÚsslÚcreate_default_contextÚwrap_socketr	   r   r?   Ú	ExceptionÚclose)ÚurirR   rS   rT   rU   rV   rW   rX   rY   r<   r=   rZ   r[   r    r\   r]   r^   ÚwsuriÚdeadliner(   Ú
connections                        r*   r   r   ~   sF  € ôf �c‹N€EØ�<Š<˜KÐ3ÜÐOÓPÐPáØˆ<˜D˜LÜÐ3Ó4Ð4ØÐ $Ð"2ÜÐFÓGÐGàˆ|Ðˆ|àÐÜ˜lÔ+à�iÒÜ5°jÓA‰
Ø	Ð	 ÜÐ4°[°MÐBÓCÐCô
 ˜Ó%€HàÐ Ü,Ðð=ð ˆ<ÙÜ—}‘}¤V§^¡^´V×5GÑ5GÓH�Ø—‘ × 0Ñ 0Ó 2Ô3ØÐ'Ð'Ð'Ø—‘˜TÕ"ä×/Ñ/Ø—Z‘Z §¡Ð,Ø×$Ñ$Ó&ó�ð �O‰O˜DÔ!ñ Ø�O‰OœF×.Ñ.´×0BÑ0BÀDÔIð �<Š<ØÐ"Ü!×8Ñ8Ó:�ØÐ&Ø"'§*¡*�Ø�O‰O˜H×,Ñ,Ó.Ô/Ø×*Ñ*¨4ÀÐ*ÓQˆDØ�O‰O˜DÔ!ô "ØØØ!Ø%ÜØØô
ˆñ 'ØØØ'ô
ˆ
ð 	×ÑØØØ×ÑÓô	
ð Ðøô ò ØÐØ�J‰JŒLØðús   ÂFH) È)Ic                óP   — |€|j                  d«      €d}nd}t        d|d| dœ|¤ŽS )aø  
    Connect to a WebSocket server listening on a Unix socket.

    This function is identical to :func:`connect`, except for the additional
    ``path`` argument. It's only available on Unix.

    It's mainly useful for debugging servers listening on Unix sockets.

    Args:
        path: File system path to the Unix socket.
        uri: URI of the WebSocket server. ``uri`` defaults to
            ``ws://localhost/`` or, when a ``ssl_context`` is provided, to
            ``wss://localhost/``.

    rS   zws://localhost/zwss://localhost/T)rp   rU   rV   © )Úgetr   )rV   rp   Úkwargss      r*   r   r   /  s9   € ð( €{Ø�:‰:�mÓ$Ð,Ø#‰Cà$ˆCÜÐ;�s ¨DÑ;°FÑ;Ð;r+   )$rp   ÚstrrR   zOptional[socket.socket]rS   zOptional[ssl.SSLContext]rT   rK   rU   ÚboolrV   rK   rW   zOptional[Origin]rX   z*Optional[Sequence[ClientExtensionFactory]]rY   zOptional[Sequence[Subprotocol]]r<   rJ   r=   rK   rZ   rK   r[   rG   r    rG   r\   zOptional[int]r]   zOptional[LoggerLike]r^   z Optional[Type[ClientConnection]]rH   r   )NN)rV   rK   rp   rK   rw   r   rH   r   ))Ú
__future__r   r'   rk   r"   Útypingr   r   r   r   Úclientr	   Údatastructuresr
   Úextensions.baser   Úextensions.permessage_deflater   r0   r   Úhttpr   Úhttp11r   r(   r   r   r   r   r   r   rp   r   rs   r   Úutilsr   Ú__all__r   r   r   ru   r+   r*   ú<module>r„      s…  ðÝ "ã Û 
Û ß 0Ó 0å #Ý (Ý 4Ý LÝ +Ý Ý ß .Ñ .ß 4Ñ 4Ý Ý "Ý ò :€ôb%�zô b%ðR %)Ø,0Ø%)ØØà#Ø=AØ48Ø04Ø'1Ø!*à$&Ø%'à#à#'à:>ñ1nØ	ðnð "ð	nð
 *ðnð #ðnð ðnð ðnð ðnð ;ðnð 2ðnð .ðnð %ðnð ðnð" "ð#nð$ #ð%nð( ð)nð, !ð-nð0 8ð1nð2 ó3nðd Øð<Ø
ð<à	ð<ð ð<ð ô	<r+   