a
    õ…bå  ã                   @   sˆ  d dl 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mZmZmZmZ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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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-ƒZ2dS )é    N)Úabstractmethod)ÚIOBase)ÚIPv4AddressÚIPv6Address)ÚAddressFamily)ÚTracebackType)ÚAnyÚAsyncContextManagerÚCallableÚ
CollectionÚDictÚListÚMappingÚOptionalÚTupleÚTypeÚTypeVarÚUnioné   )ÚTypedAttributeProviderÚTypedAttributeSetÚtyped_attributeé   )Ú
ByteStreamÚListenerÚT_StreamÚUnreliableObjectStream)Ú	TaskGroupÚT_Retvalc                   @   sB   e Zd Zddœdd„Zeee  ee ee ee dœdd„Z	dS )Ú_NullAsyncContextManagerN©Úreturnc                 Ã   s   d S ©N© ©Úselfr#   r#   ú1lib/python3.9/site-packages/anyio/abc/_sockets.pyÚ
__aenter__   s    z#_NullAsyncContextManager.__aenter__)Úexc_typeÚexc_valÚexc_tbr!   c                 Ã   s   d S r"   r#   )r%   r(   r)   r*   r#   r#   r&   Ú	__aexit__   s    z"_NullAsyncContextManager.__aexit__)
Ú__name__Ú
__module__Ú__qualname__r'   r   r   ÚBaseExceptionr   Úboolr+   r#   r#   r#   r&   r      s
   
þr   c                   @   sd   e Zd ZU eƒ Zeed< eƒ Zeed< eƒ Z	e
ed< eƒ Zejed< eƒ Zeed< eƒ Ze
ed< dS )ÚSocketAttributeÚfamilyÚlocal_addressÚ
local_portÚ
raw_socketÚremote_addressÚremote_portN)r,   r-   r.   r   r2   r   Ú__annotations__r3   ÚSockAddrTyper4   Úintr5   Úsocketr6   r7   r#   r#   r#   r&   r1       s   
r1   c                   @   sF   e Zd Zeeeeg ef f dœdd„ƒZeee	j	dœdd„ƒƒZ
dS )Ú_SocketProviderr    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 r"   )Ú_raw_socketr2   r#   r$   r#   r&   Ú<lambda>5   ó    z2_SocketProvider.extra_attributes.<locals>.<lambda>c                      s   ˆ ˆj  ¡ ƒS r"   ©r>   Zgetsocknamer#   )Úconvertr%   r#   r&   r?   6   r@   c                      s   ˆ j S r"   )r>   r#   r$   r#   r&   r?   7   r@   c                      s   ˆ S r"   r#   r#   )Úpeernamer#   r&   r?   @   r@   c                      s   ˆ j  ¡ d S )Nr   rA   r#   r$   r#   r&   r?   D   r@   r   c                      s   ˆ S r"   r#   r#   )r7   r#   r&   r?   G   r@   )Z_core._socketsr=   r1   r2   r3   r5   r>   ZgetpeernameÚOSErrorr6   r   ZAF_INETZAF_INET6r4   r7   )r%   Z
attributesr#   )rB   rC   r7   r%   r&   Úextra_attributes0   s"    ý
z _SocketProvider.extra_attributesc                 C   s   d S r"   r#   r$   r#   r#   r&   r>   K   s    z_SocketProvider._raw_socketN)r,   r-   r.   Úpropertyr   r   r
   rE   r   r;   r>   r#   r#   r#   r&   r<   /   s
    r<   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   Q   s   rG   c                   @   sP   e Zd Zeeeeeef  ddœdd„ƒZ	eeee
eee f dœdd„ƒZdS )ÚUNIXSocketStreamN)Ú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%   rK   rL   r#   r#   r&   Úsend_fdsZ   s    zUNIXSocketStream.send_fds)Ú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%   rN   rO   r#   r#   r&   Úreceive_fdsd   s    zUNIXSocketStream.receive_fds)r,   r-   r.   r   Úbytesr   r   r:   r   rM   r   r   rP   r#   r#   r#   r&   rJ   Y   s    	rJ   c                   @   sD   e Zd ZdZeedœdd„ƒZd	eege	f e
e ddœdd„ZdS )
ÚSocketListenerz}
    Listens to incoming socket connections.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r    c                 Ã   s   dS )zAccept an incoming connection.Nr#   r$   r#   r#   r&   Úacceptv   s    zSocketListener.acceptN)ÚhandlerÚ
task_groupr!   c              	   Ã   s~   ddl m} |d u r |ƒ  }}ntƒ }|4 I d H š2 |  ¡ I d H }| ||¡ q4W d   ƒI d H  qz1 I d H sp0    Y  d S )Nr   )Úcreate_task_group)Ú rV   r   rS   Z
start_soon)r%   rT   rU   rV   Zcontext_managerÚstreamr#   r#   r&   Úservez   s    zSocketListener.serve)N)r,   r-   r.   rI   r   rG   rS   r
   r   r   r   r   rY   r#   r#   r#   r&   rR   o   s    ÿÿrR   c                   @   s$   e Zd ZdZeeeddœdd„ZdS )Ú	UDPSocketz{
    Represents an unconnected UDP socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    N)ÚdataÚhostÚportr!   c                 Ã   s   |   |||ff¡I dH S )zKAlias for :meth:`~.UnreliableObjectSendStream.send` ((data, (host, port))).N)Úsend)r%   r[   r\   r]   r#   r#   r&   Úsendto’   s    zUDPSocket.sendto)r,   r-   r.   rI   rQ   Ústrr:   r_   r#   r#   r#   r&   rZ   ‹   s   rZ   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&   ra   —   s   ra   )3r;   Úabcr   Úior   Z	ipaddressr   r   r   Útypesr   Útypingr   r	   r
   r   r   r   r   r   r   r   r   r   Z_core._typedattrr   r   r   Z_streamsr   r   r   r   Z_tasksr   r`   ZIPAddressTyper:   ZIPSockAddrTyper9   rQ   ZUDPPacketTyper   r   r1   r<   rG   rJ   rR   rZ   ra   r#   r#   r#   r&   Ú<module>   s,   8
"