a
    h3                  	   @  s:  U d dl mZ d dlZd dlZd dlZd dl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mZ d dl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dlmZmZm Z  ddl!m"Z" ej#dkrd dlm$Z$ nd dl%m$Z$ ee&eef Z'de(d< e)e&e*f Z+de(d< ee+e&f Z,de(d< e)e-e+f Z.de(d< e)e-e&f Z/de(d< edZ0ej1fdddddddddd d!d"Z2G d#d$ d$eZ3G d%d& d&eZ4G d'd( d(ee4Z5G d)d* d*e5Z6G d+d, d,ee5 e4Z7G d-d. d.e e. e4Z8G d/d0 d0e e- e4Z9G d1d2 d2e e/ e4Z:G d3d4 d4e e- e4Z;dS )5    )annotationsN)abstractmethod)Callable
CollectionMapping)AsyncExitStack)IOBase)IPv4AddressIPv6Address)AddressFamily)AnyTypeVarUnion   )get_async_backend)TypedAttributeProviderTypedAttributeSettyped_attribute   )
ByteStreamListenerUnreliableObjectStream)	TaskGroup)   
   )	TypeAliasr   IPAddressTypeIPSockAddrTypeSockAddrTypeUDPPacketTypeUNIXDatagramPacketTypeT_RetvalF)require_connectedrequire_boundsocket.socket | intzsocket.SocketKindzsocket.AddressFamilyboolsocket.socket)
sock_or_fd	sock_typeaddr_familyr"   r#   returnc             
   C  s  t | tr|ztj| d}W q tyx } zF|jtjkrBtd|n"|rRtd|n|rbtd|n W Y d }~qd }~0 0 n(t | tjr| }ntdt| j	 dz|rz|
  W n. ty } ztd|W Y d }~n
d }~0 0 |rBz.|jtjtjfv r| d }n| }W n ty2   d }Y n0 |sBtd|tjkrt|j|krttd|j d	|jj |j|krtd
|j d	|jj W n* ty   t | tr|   Y n0 |d |S )N)filenoz.the file descriptor does not refer to a socketzthe socket must be connectedz+the socket must be bound to a local addresszexpected an int or socket, got z insteadr   z"address family mismatch: expected z, got zsocket type mismatch: expected F)
isinstanceintsocketOSErrorerrnoENOTSOCK
ValueError	TypeErrortype__qualname__getpeernamefamilyAF_INETAF_INET6getsockname	AF_UNSPECnameBaseExceptiondetachsetblocking)r'   r(   r)   r"   r#   sockexcZ
bound_addr rB   N/var/www/html/assistant/venv/lib/python3.9/site-packages/anyio/abc/_sockets.py_validate_socket$   sf    
 


rD   c                   @  sf   e Zd ZU dZe Zded< e Zded< e Zded< e Z	ded	< e Z
ded
< e Zded< dS )SocketAttributea  
    .. attribute:: family
        :type: socket.AddressFamily

        the address family of the underlying socket

    .. attribute:: local_address
        :type: tuple[str, int] | str

        the local address the underlying socket is connected to

    .. attribute:: local_port
        :type: int

        for IP based sockets, the local port the underlying socket is bound to

    .. attribute:: raw_socket
        :type: socket.socket

        the underlying stdlib socket object

    .. attribute:: remote_address
        :type: tuple[str, int] | str

        the remote address the underlying socket is connected to

    .. attribute:: remote_port
        :type: int

        for IP based sockets, the remote port the underlying socket is connected to
    r   r7   r   local_addressr-   
local_portr&   
raw_socketremote_addressremote_portN)__name__
__module__r5   __doc__r   r7   __annotations__rF   rG   rH   rI   rJ   rB   rB   rB   rC   rE   i   s   
 rE   c                   @  s4   e Zd ZeddddZeeddddZdS )	_SocketProviderzMapping[Any, Callable[[], Any]]r*   c                   s   ddl m  tjfddtj fddtjfddi}z j W n tyd   d Y n0 d urfdd|tj	< jjt
jt
jfv rȇfdd|tj< d urȈd	 fd
d|tj< |S )Nr   )convert_ipv6_sockaddrc                     s    j jS N)_raw_socketr7   rB   selfrB   rC   <lambda>       z2_SocketProvider.extra_attributes.<locals>.<lambda>c                     s    j  S rR   rS   r:   rB   )convertrU   rB   rC   rV      s   c                     s    j S rR   )rS   rB   rT   rB   rC   rV      rW   c                     s    S rR   rB   rB   )peernamerB   rC   rV      rW   c                     s    j  d S )Nr   rX   rB   rT   rB   rC   rV      rW   r   c                     s    S rR   rB   rB   )rJ   rB   rC   rV      rW   )Z_core._socketsrQ   rE   r7   rF   rH   rS   r6   r/   rI   r   r8   r9   rG   rJ   )rU   
attributesrB   )rY   rZ   rJ   rU   rC   extra_attributes   s$    

z _SocketProvider.extra_attributesr&   c                 C  s   d S rR   rB   rT   rB   rB   rC   rS      s    z_SocketProvider._raw_socketN)rK   rL   r5   propertyr\   r   rS   rB   rB   rB   rC   rO      s
   rO   c                   @  s$   e Zd ZdZedd dddZdS )SocketStreamzu
    Transports bytes over a socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r$   r'   r*   c                   s"   t |tjdd}t |I dH S )aH  
        Wrap an existing socket object or file descriptor as a socket stream.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must already be connected.

        :param sock_or_fd: a socket object or file descriptor
        :return: a socket stream

        Tr"   N)rD   r.   SOCK_STREAMr   Zwrap_stream_socketclsr'   r@   rB   rB   rC   from_socket   s    zSocketStream.from_socketNrK   rL   r5   rM   classmethodrd   rB   rB   rB   rC   r^      s   r^   c                   @  sL   e Zd Zedd dddZeddddd	d
ZeddddddZdS )UNIXSocketStreamr$   r_   c                   s&   t |tjtjdd}t |I dH S )aR  
        Wrap an existing socket object or file descriptor as a UNIX socket stream.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must already be connected.

        :param sock_or_fd: a socket object or file descriptor
        :return: a UNIX socket stream

        Tr`   N)rD   r.   ra   AF_UNIXr   Zwrap_unix_stream_socketrb   rB   rB   rC   rd      s    zUNIXSocketStream.from_socketbyteszCollection[int | IOBase]None)messagefdsr*   c                   s   dS )z
        Send file descriptors along with a message to the peer.

        :param message: a non-empty bytestring
        :param fds: a collection of files (either numeric file descriptors or open file
            or socket objects)
        NrB   )rU   rk   rl   rB   rB   rC   send_fds   s    zUNIXSocketStream.send_fdsr-   ztuple[bytes, list[int]])msglenmaxfdsr*   c                   s   dS )a  
        Receive file descriptors along with a message from the peer.

        :param msglen: length of the message to expect from the peer
        :param maxfds: maximum number of file descriptors to expect from the peer
        :return: a tuple of (message, file descriptors)
        NrB   )rU   rn   ro   rB   rB   rC   receive_fds   s    zUNIXSocketStream.receive_fdsN)rK   rL   r5   rf   rd   r   rm   rp   rB   rB   rB   rC   rg      s   	rg   c                   @  sJ   e Zd ZdZedd dddZedddd	ZdddddddZd
S )SocketListenerz}
    Listens to incoming socket connections.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r$   r_   c                   s"   t |tjdd}t |I dH S )a  
        Wrap an existing socket object or file descriptor as a socket listener.

        The newly created listener takes ownership of the socket being passed in.

        :param sock_or_fd: a socket object or file descriptor
        :return: a socket listener

        Tr#   N)rD   r.   ra   r   Zwrap_listener_socketrb   rB   rB   rC   rd      s    zSocketListener.from_socketr^   rP   c                   s   dS )zAccept an incoming connection.NrB   rT   rB   rB   rC   accept  s    zSocketListener.acceptNzCallable[[SocketStream], Any]zTaskGroup | Nonerj   )handler
task_groupr*   c              	     s   ddl m} t 4 I d H L}|d u r6|| I d H }|  I d H }||| q6W d   I d H  q|1 I d H sr0    Y  d S )Nr   )create_task_group) rv   r   enter_async_contextrs   Z
start_soon)rU   rt   ru   rv   stackstreamrB   rB   rC   serve  s    zSocketListener.serve)N)	rK   rL   r5   rM   rf   rd   r   rs   r{   rB   rB   rB   rC   rq      s    rq   c                   @  s8   e Zd ZdZedd dddZdddd	d
ddZdS )	UDPSocketz{
    Represents an unconnected UDP socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r$   r_   c                   s"   t |tjdd}t |I dH S )aI  
        Wrap an existing socket object or file descriptor as a UDP socket.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must be bound to a local address.

        :param sock_or_fd: a socket object or file descriptor
        :return: a UDP socket

        Trr   N)rD   r.   
SOCK_DGRAMr   Zwrap_udp_socketrb   rB   rB   rC   rd   )  s    zUDPSocket.from_socketri   strr-   rj   )datahostportr*   c                   s   |  |||ffI dH S )z^
        Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, (host, port))).

        Nsend)rU   r   r   r   rB   rB   rC   sendto8  s    zUDPSocket.sendtoNrK   rL   r5   rM   rf   rd   r   rB   rB   rB   rC   r|   "  s   r|   c                   @  s$   e Zd ZdZedd dddZdS )ConnectedUDPSocketzy
    Represents an connected UDP socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r$   r_   c                   s"   t |tjdd}t |I dH S )aV  
        Wrap an existing socket object or file descriptor as a connected UDP socket.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must already be connected.

        :param sock_or_fd: a socket object or file descriptor
        :return: a connected UDP socket

        Tr`   N)rD   r.   r}   r   Zwrap_connected_udp_socketrb   rB   rB   rC   rd   G  s    zConnectedUDPSocket.from_socketNre   rB   rB   rB   rC   r   @  s   r   c                   @  s6   e Zd ZdZedd dddZdddd	d
dZdS )UNIXDatagramSocketz
    Represents an unconnected Unix datagram socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r$   r_   c                   s"   t |tjtj}t |I dH S )a'  
        Wrap an existing socket object or file descriptor as a UNIX datagram
        socket.

        The newly created socket wrapper takes ownership of the socket being passed in.

        :param sock_or_fd: a socket object or file descriptor
        :return: a UNIX datagram socket

        N)rD   r.   r}   rh   r   Zwrap_unix_datagram_socketrb   rB   rB   rC   rd   d  s    zUNIXDatagramSocket.from_socketri   r~   rj   )r   pathr*   c                   s   |  ||fI dH S )zCAlias for :meth:`~.UnreliableObjectSendStream.send` ((data, path)).Nr   )rU   r   r   rB   rB   rC   r   v  s    zUNIXDatagramSocket.sendtoNr   rB   rB   rB   rC   r   [  s   r   c                   @  s$   e Zd ZdZedd dddZdS )ConnectedUNIXDatagramSocketz
    Represents a connected Unix datagram socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r$   r_   c                   s&   t |tjtjdd}t |I dH S )ar  
        Wrap an existing socket object or file descriptor as a connected UNIX datagram
        socket.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must already be connected.

        :param sock_or_fd: a socket object or file descriptor
        :return: a connected UNIX datagram socket

        Tr`   N)rD   r.   r}   rh   r   Z#wrap_connected_unix_datagram_socketrb   rB   rB   rC   rd     s    z'ConnectedUNIXDatagramSocket.from_socketNre   rB   rB   rB   rC   r   {  s   r   )<
__future__r   r0   r.   sysabcr   collections.abcr   r   r   
contextlibr   ior   	ipaddressr	   r
   r   typingr   r   r   Z_core._eventloopr   Z_core._typedattrr   r   r   Z_streamsr   r   r   Z_tasksr   version_infor   Ztyping_extensionsr~   r   rN   tupler-   r   r   ri   r   r    r!   r;   rD   rE   rO   r^   rg   rq   r|   r   r   r   rB   rB   rB   rC   <module>   sN   
E)&',
 