o
    f}                     @  s  d dl m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 d d
lmZmZmZ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e"eef Z#ee"e$f Z%ee%e"f Z&ee'e%f Z(ee'e"f Z)edZ*G dd dZ+G dd deZ,G dd deZ-G dd dee-Z.G dd de.Z/G dd dee. e-Z0G dd dee( e-Z1G dd  d ee' e-Z2G d!d" d"ee) e-Z3G d#d$ d$ee' e-Z4dS )%    )annotationsN)abstractmethod)Callable
CollectionMapping)AsyncExitStack)IOBase)IPv4AddressIPv6Address)AddressFamily)TracebackType)AnyTupleTypeVarUnion   )TypedAttributeProviderTypedAttributeSettyped_attribute   )
ByteStreamListenerUnreliableObjectStream)	TaskGroupT_Retvalc                   @  s    e Zd ZdddZdddZdS )_NullAsyncContextManagerreturnNonec                      d S N selfr    r    J/var/www/NoticeGen/venv/lib/python3.10/site-packages/anyio/abc/_sockets.py
__aenter__   s   z#_NullAsyncContextManager.__aenter__exc_typetype[BaseException] | Noneexc_valBaseException | Noneexc_tbTracebackType | Nonebool | Nonec                   r   r   r    )r"   r%   r'   r)   r    r    r#   	__aexit__!   s   z"_NullAsyncContextManager.__aexit__N)r   r   )r%   r&   r'   r(   r)   r*   r   r+   )__name__
__module____qualname__r$   r,   r    r    r    r#   r      s    
r   c                   @  sb   e Zd ZU 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 )SocketAttributer   familySockAddrTypelocal_addressint
local_portsocket.socket
raw_socketremote_addressremote_portN)r-   r.   r/   r   r1   __annotations__r3   r5   r7   r8   r9   r    r    r    r#   r0   *   s   
 r0   c                   @  s,   e Zd Zed	ddZeed
ddZdS )_SocketProviderr   Mapping[Any, Callable[[], Any]]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y2   d Y nw d ur@fdd|tj	< jjt
jt
jfv rdfdd|tj< d urdd	 fd
d|tj< |S )Nr   )convert_ipv6_sockaddrc                     s    j jS r   )_raw_socketr1   r    r!   r    r#   <lambda>?   s    z2_SocketProvider.extra_attributes.<locals>.<lambda>c                     s    j  S r   r>   getsocknamer    )convertr"   r    r#   r?   @   s    c                     s    j S r   )r>   r    r!   r    r#   r?   C       c                         S r   r    r    )peernamer    r#   r?   L       c                     s    j  d S )Nr   r@   r    r!   r    r#   r?   Q   s    r   c                     rD   r   r    r    )r9   r    r#   r?   U   rF   )_core._socketsr=   r0   r1   r3   r7   r>   getpeernameOSErrorr8   r   AF_INETAF_INET6r5   r9   )r"   
attributesr    )rB   rE   r9   r"   r#   extra_attributes:   s&   
z _SocketProvider.extra_attributesr6   c                 C  s   d S r   r    r!   r    r    r#   r>   Y   s   z_SocketProvider._raw_socketN)r   r<   )r   r6   )r-   r.   r/   propertyrM   r   r>   r    r    r    r#   r;   9   s    r;   c                   @     e Zd ZdZdS )SocketStreamzu
    Transports bytes over a socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    Nr-   r.   r/   __doc__r    r    r    r#   rP   _       rP   c                   @  s(   e Zd ZedddZedddZdS )UNIXSocketStreammessagebytesfdsCollection[int | IOBase]r   r   c                      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)
        Nr    )r"   rU   rW   r    r    r#   send_fdsh   rC   zUNIXSocketStream.send_fdsmsglenr4   maxfdstuple[bytes, list[int]]c                   rY   )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)
        Nr    )r"   r[   r\   r    r    r#   receive_fdsr   rC   zUNIXSocketStream.receive_fdsN)rU   rV   rW   rX   r   r   )r[   r4   r\   r4   r   r]   )r-   r.   r/   r   rZ   r^   r    r    r    r#   rT   g   s
    	rT   c                   @  s,   e Zd ZdZedddZ	ddddZdS )SocketListenerz}
    Listens to incoming socket connections.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r   rP   c                   rY   )zAccept an incoming connection.Nr    r!   r    r    r#   accept   rC   zSocketListener.acceptNhandlerCallable[[SocketStream], Any]
task_groupTaskGroup | Noner   c              	     sp   ddl m} t 4 I d H }|d u r|| I d H }	 |  I d H }||| q1 I d H s1w   Y  d S )Nr   )create_task_group) re   r   enter_async_contextr`   
start_soon)r"   ra   rc   re   stackstreamr    r    r#   serve   s   zSocketListener.serve)r   rP   r   )ra   rb   rc   rd   r   r   )r-   r.   r/   rR   r   r`   rk   r    r    r    r#   r_   }   s    r_   c                   @  s   e Zd ZdZdd
dZdS )	UDPSocketz{
    Represents an unconnected UDP socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    datarV   hoststrportr4   r   r   c                   s   |  |||ffI dH S )z^
        Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, (host, port))).

        Nsend)r"   rm   rn   rp   r    r    r#   sendto   s   zUDPSocket.sendtoN)rm   rV   rn   ro   rp   r4   r   r   r-   r.   r/   rR   rs   r    r    r    r#   rl      s    rl   c                   @  rO   )ConnectedUDPSocketzy
    Represents an connected UDP socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    NrQ   r    r    r    r#   ru      rS   ru   c                   @  s   e Zd ZdZddd	Zd
S )UNIXDatagramSocketz
    Represents an unconnected Unix datagram socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    rm   rV   pathro   r   r   c                   s   |  ||fI dH S )zCAlias for :meth:`~.UnreliableObjectSendStream.send` ((data, path)).Nrq   )r"   rm   rw   r    r    r#   rs      s   zUNIXDatagramSocket.sendtoN)rm   rV   rw   ro   r   r   rt   r    r    r    r#   rv      s    rv   c                   @  rO   )ConnectedUNIXDatagramSocketz
    Represents a connected Unix datagram socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    NrQ   r    r    r    r#   rx      rS   rx   )5
__future__r   socketabcr   collections.abcr   r   r   
contextlibr   ior   	ipaddressr	   r
   r   typesr   typingr   r   r   r   _core._typedattrr   r   r   _streamsr   r   r   _tasksr   ro   IPAddressTyper4   IPSockAddrTyper2   rV   UDPPacketTypeUNIXDatagramPacketTyper   r   r0   r;   rP   rT   r_   rl   ru   rv   rx   r    r    r    r#   <module>   s>    &
