U
    &%e{                     @  sz  d dl mZ d dlZd dl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mZ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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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*Z-G dd dee' e*Z.G dd dee& e*Z/dS )    )annotationsN)abstractmethod)AsyncExitStack)IOBase)IPv4AddressIPv6Address)AddressFamily)AnyCallable
CollectionMappingTupleTypeVarUnion   )create_task_group)TypedAttributeProviderTypedAttributeSettyped_attribute   )
ByteStreamListenerUnreliableObjectStream)	TaskGroupT_Retvalc                   @  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)__name__
__module____qualname__r   r   __annotations__r   r    r"   r#   r$    r)   r)   Q/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/anyio/abc/_sockets.pyr   #   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]]returnc                   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 N)_raw_socketr   r)   selfr)   r*   <lambda>8       z2_SocketProvider.extra_attributes.<locals>.<lambda>c                     s    j  S r/   r0   getsocknamer)   )convertr2   r)   r*   r3   9   s   c                     s    j S r/   )r0   r)   r1   r)   r*   r3   <   r4   c                     s    S r/   r)   r)   )peernamer)   r*   r3   E   r4   c                     s    j  d S )Nr   r5   r)   r1   r)   r*   r3   K   r4   r   c                     s    S r/   r)   r)   )r$   r)   r*   r3   N   r4   )Z_core._socketsr.   r   r   r   r"   r0   getpeernameOSErrorr#   r   AF_INETAF_INET6r    r$   )r2   
attributesr)   )r7   r8   r$   r2   r*   extra_attributes3   s.     
  


z _SocketProvider.extra_attributesr!   c                 C  s   d S r/   r)   r1   r)   r)   r*   r0   R   s    z_SocketProvider._raw_socketN)r%   r&   r'   propertyr>   r   r0   r)   r)   r)   r*   r+   2   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*   r@   X   s   r@   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]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)
        Nr)   )r2   rF   rG   r)   r)   r*   send_fdsa   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)   )r2   rI   rJ   r)   r)   r*   receive_fdsk   s    zUNIXSocketStream.receive_fdsN)r%   r&   r'   r   rH   rK   r)   r)   r)   r*   rC   `   s   	rC   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`.
    r@   r,   c                   s   dS )zAccept an incoming connection.Nr)   r1   r)   r)   r*   accept}   s    zSocketListener.acceptNzCallable[[SocketStream], Any]zTaskGroup | NonerE   )handler
task_groupr-   c              
     sZ   t  4 I d H <}|d kr*|t I d H }|  I d H }||| q*W 5 Q I d H R X d S r/   )r   enter_async_contextr   rM   Z
start_soon)r2   rN   rO   Z
exit_stackstreamr)   r)   r*   serve   s
    zSocketListener.serve)N)r%   r&   r'   rB   r   rM   rR   r)   r)   r)   r*   rL   v   s
    rL   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`.
    rD   strr   rE   )datahostportr-   c                   s   |  |||ffI dH S )zKAlias for :meth:`~.UnreliableObjectSendStream.send` ((data, (host, port))).N)send)r2   rU   rV   rW   r)   r)   r*   sendto   s    zUDPSocket.sendtoN)r%   r&   r'   rB   rY   r)   r)   r)   r*   rS      s   rS   c                   @  s   e Zd ZdZdS )ConnectedUDPSocketzy
    Represents an connected UDP socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    NrA   r)   r)   r)   r*   rZ      s   rZ   )0
__future__r   socketabcr   
contextlibr   ior   	ipaddressr   r   r   typingr	   r
   r   r   r   r   r   Z_core._tasksr   Z_core._typedattrr   r   r   Z_streamsr   r   r   _tasksr   rT   ZIPAddressTyper   ZIPSockAddrTyper   rD   ZUDPPacketTyper   r   r+   r@   rC   rL   rS   rZ   r)   r)   r)   r*   <module>   s.   $
&