U
    ‰¾úg}  ã                   @  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d„Zddddd	œd
d„ZdS )Ú_NullAsyncContextManagerÚNone©Úreturnc                 Ã  s   d S ©N© ©Úselfr    r    ú6/tmp/pip-unpacked-wheel-3u0cc9gf/anyio/abc/_sockets.pyÚ
__aenter__   s    z#_NullAsyncContextManager.__aenter__ztype[BaseException] | NonezBaseException | NonezTracebackType | Nonezbool | None)Úexc_typeÚexc_valÚexc_tbr   c                 Ã  s   d S r   r    )r"   r%   r&   r'   r    r    r#   Ú	__aexit__!   s    z"_NullAsyncContextManager.__aexit__N)Ú__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   r-   Ú__annotations__r/   r1   r3   r4   r5   r    r    r    r#   r,   *   s   
r,   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k
rf   d ‰Y nX ˆd k	r‚‡fdd„|tj	< ˆjjt
jt
jfkrÊ‡fdd„|tj< ˆd k	rÊˆd	 ‰‡fd
d„|tj< |S )Nr   )Úconvert_ipv6_sockaddrc                     s   ˆ j jS r   )Ú_raw_socketr-   r    r!   r    r#   Ú<lambda>?   ó    z2_SocketProvider.extra_attributes.<locals>.<lambda>c                     s   ˆ ˆj  ¡ ƒS r   ©r9   Úgetsocknamer    )Úconvertr"   r    r#   r:   @   s   ÿc                     s   ˆ j S r   )r9   r    r!   r    r#   r:   C   r;   c                     s   ˆ S r   r    r    )Úpeernamer    r#   r:   L   r;   c                     s   ˆ j  ¡ d S )Nr   r<   r    r!   r    r#   r:   Q   r;   r   c                     s   ˆ S r   r    r    )r5   r    r#   r:   U   r;   )Z_core._socketsr8   r,   r-   r/   r3   r9   ÚgetpeernameÚOSErrorr4   r   ÚAF_INETÚAF_INET6r1   r5   )r"   Ú
attributesr    )r>   r?   r5   r"   r#   Úextra_attributes:   s*     
  
û

ÿz _SocketProvider.extra_attributesr2   c                 C  s   d S r   r    r!   r    r    r#   r9   Y   s    z_SocketProvider._raw_socketN)r)   r*   r+   ÚpropertyrE   r   r9   r    r    r    r#   r7   9   s
   r7   c                   @  s   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#   rG   _   s   rG   c                   @  s8   e Zd Zeddddœdd„ƒZedddd	œd
d„ƒZdS )ÚUNIXSocketStreamÚbyteszCollection[int | IOBase]r   )Ú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)
        Nr    )r"   rL   rM   r    r    r#   Úsend_fdsh   s    zUNIXSocketStream.send_fdsr0   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)
        Nr    )r"   rO   rP   r    r    r#   Úreceive_fdsr   s    zUNIXSocketStream.receive_fdsN)r)   r*   r+   r   rN   rQ   r    r    r    r#   rJ   g   s   	rJ   c                   @  s6   e Zd Z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`.
    rG   r   c                 Ã  s   dS )zAccept an incoming connection.Nr    r!   r    r    r#   Úaccept„   s    zSocketListener.acceptNzCallable[[SocketStream], Any]zTaskGroup | Noner   )ÚhandlerÚ
task_groupr   c              
   Ã  sf   ddl m} tƒ 4 I d H š<}|d kr6| |ƒ ¡I d H }|  ¡ I d H }| ||¡ q6W 5 Q I d H R X d S )Nr   )Úcreate_task_group)Ú rV   r   Úenter_async_contextrS   Z
start_soon)r"   rT   rU   rV   ÚstackÚstreamr    r    r#   Úserveˆ   s    zSocketListener.serve)N)r)   r*   r+   rI   r   rS   r[   r    r    r    r#   rR   }   s
    ýrR   c                   @  s$   e Zd Z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`.
    rK   Ústrr0   r   )ÚdataÚhostÚportr   c                 Ã  s   |   |||ff¡I dH S )z^
        Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, (host, port))).

        N©Úsend)r"   r^   r_   r`   r    r    r#   ÚsendtoŸ   s    zUDPSocket.sendtoN©r)   r*   r+   rI   rc   r    r    r    r#   r\   ˜   s   r\   c                   @  s   e Zd ZdZdS )ÚConnectedUDPSocketzy
    Represents an connected UDP socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    NrH   r    r    r    r#   re   §   s   re   c                   @  s"   e Zd Z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`.
    rK   r]   r   )r^   Úpathr   c                 Ã  s   |   ||f¡I dH S )zCAlias for :meth:`~.UnreliableObjectSendStream.send` ((data, path)).Nra   )r"   r^   rg   r    r    r#   rc   ¸   s    zUNIXDatagramSocket.sendtoNrd   r    r    r    r#   rf   ¯   s   rf   c                   @  s   e Zd ZdZdS )ÚConnectedUNIXDatagramSocketz‚
    Represents a connected Unix datagram socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    NrH   r    r    r    r#   rh   ½   s   rh   )5Ú
__future__r   ÚsocketÚabcr   Úcollections.abcr   r   r   Ú
contextlibr   Úior   Ú	ipaddressr	   r
   r   Útypesr   Útypingr   r   r   r   Z_core._typedattrr   r   r   Z_streamsr   r   r   Z_tasksr   r]   ZIPAddressTyper0   ZIPSockAddrTyper.   rK   ZUDPPacketTypeZUNIXDatagramPacketTyper   r   r,   r7   rG   rJ   rR   r\   re   rf   rh   r    r    r    r#   Ú<module>   s>   &
 ÿ