a
    %gv                     @  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 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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   U/var/www/html/llm_bihealth/app/venv/lib/python3.9/site-packages/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.   r0   r2   r3   r4   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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_socketr,   r   r    r   r"   <lambda>?       z2_SocketProvider.extra_attributes.<locals>.<lambda>c                     s    j  S r   r8   getsocknamer   )convertr!   r   r"   r9   @   s   c                     s    j S r   )r8   r   r    r   r"   r9   C   r:   c                     s    S r   r   r   )peernamer   r"   r9   L   r:   c                     s    j  d S )Nr   r;   r   r    r   r"   r9   Q   r:   r   c                     s    S r   r   r   )r4   r   r"   r9   U   r:   )Z_core._socketsr7   r+   r,   r.   r2   r8   getpeernameOSErrorr3   r   AF_INETAF_INET6r0   r4   )r!   
attributesr   )r=   r>   r4   r!   r"   extra_attributes:   s$    

z _SocketProvider.extra_attributesr1   c                 C  s   d S r   r   r    r   r   r"   r8   Y   s    z_SocketProvider._raw_socketN)r(   r)   r*   propertyrD   r   r8   r   r   r   r"   r6   9   s
   r6   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"   rF   _   s   rF   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!   rK   rL   r   r   r"   send_fdsh   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)
        Nr   )r!   rN   rO   r   r   r"   receive_fdsr   s    zUNIXSocketStream.receive_fdsN)r(   r)   r*   r   rM   rP   r   r   r   r"   rI   g   s   	rI   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`.
    rF   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              	     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) rU   r   enter_async_contextrR   Z
start_soon)r!   rS   rT   rU   stackstreamr   r   r"   serve   s    zSocketListener.serve)N)r(   r)   r*   rH   r   rR   rZ   r   r   r   r"   rQ   }   s
    rQ   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`.
    rJ   strr/   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*   rH   rb   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`.
    NrG   r   r   r   r"   rd      s   rd   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`.
    rJ   r\   r   )r]   pathr   c                   s   |  ||fI dH S )zCAlias for :meth:`~.UnreliableObjectSendStream.send` ((data, path)).Nr`   )r!   r]   rf   r   r   r"   rb      s    zUNIXDatagramSocket.sendtoNrc   r   r   r   r"   re      s   re   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`.
    NrG   r   r   r   r"   rg      s   rg   )5
__future__r   socketabcr   collections.abcr   r   r   
contextlibr   ior   	ipaddressr	   r
   r   typesr   typingr   r   r   Z_core._typedattrr   r   r   Z_streamsr   r   r   Z_tasksr   r\   ZIPAddressTypetupler/   ZIPSockAddrTyper-   rJ   ZUDPPacketTypeZUNIXDatagramPacketTyper   r   r+   r6   rF   rI   rQ   r[   rd   re   rg   r   r   r   r"   <module>   s<   &
