o
    %=jD3  ã                   @  sú  U d dl mZ d dl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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B eB Z#de$d< e%e"e&f Z'de$d< e'e"B Z(de$d< e%e)e'f Z*de$d< e%e)e"f Z+de$d< edƒZ,ej-fdddœd8d$d%„Z.G d&d'„ d'eƒZ/G d(d)„ d)eƒZ0G d*d+„ d+ee0ƒZ1G d,d-„ d-e1ƒZ2G d.d/„ d/ee1 e0ƒZ3G d0d1„ d1ee* e0ƒZ4G d2d3„ d3ee) e0ƒZ5G d4d5„ d5ee+ e0ƒZ6G d6d7„ d7ee) e0ƒZ7dS )9é    )ÚannotationsN)Úabstractmethod)ÚCallableÚ
CollectionÚMapping)ÚAsyncExitStack)ÚIOBase)ÚIPv4AddressÚIPv6Address)ÚAddressFamily)ÚAnyÚ	TypeAliasÚTypeVaré   )Úget_async_backend)ÚTypedAttributeProviderÚTypedAttributeSetÚtyped_attributeé   )Ú
ByteStreamÚListenerÚUnreliableObjectStream)Ú	TaskGroupr   ÚIPAddressTypeÚIPSockAddrTypeÚSockAddrTypeÚUDPPacketTypeÚUNIXDatagramPacketTypeÚT_RetvalF)Úrequire_connectedÚrequire_boundÚ
sock_or_fdúsocket.socket | intÚ	sock_typeúsocket.SocketKindÚaddr_familyúsocket.AddressFamilyr   Úboolr    Úreturnúsocket.socketc             
   C  s   t | tƒr4ztj| d�}W n: ty3 } z|jtjkr tdƒ|‚|r'tdƒ|‚|r.tdƒ|‚‚ d }~ww t | tjƒr=| }ntdt| ƒj	› d�ƒ‚zo|rcz| 
¡  W n tyb } ztdƒ|‚d }~ww |r�z|jtjtjfv rv| ¡ d }n| ¡ }W n ty†   d }Y nw |s�tdƒ‚|tjkr¤|j|kr¤td|j› d	|jj› �ƒ‚|j|kr¶td
|j› d	|jj› �ƒ‚W n tyÈ   t | tƒrÇ| ¡  ‚ w | d¡ |S )N)Úfilenoz.the file descriptor does not refer to a socketzthe socket must be connectedz+the socket must be bound to a local addresszexpected an int or socket, got z insteadr   z"address family mismatch: expected z, got zsocket type mismatch: expected F)Ú
isinstanceÚintÚsocketÚOSErrorÚerrnoÚENOTSOCKÚ
ValueErrorÚ	TypeErrorÚtypeÚ__qualname__ÚgetpeernameÚfamilyÚAF_INETÚAF_INET6ÚgetsocknameÚ	AF_UNSPECÚnameÚBaseExceptionÚdetachÚsetblocking)r!   r#   r%   r   r    ÚsockÚexcZ
bound_addr© rA   ú\C:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\site-packages\anyio/abc/_sockets.pyÚ_validate_socket   sv   
ÿþ

€öÿ
€ÿ€ÿ
ÿÿ
ÿÿ
û
rC   c                   @  sf   e Zd ZU dZ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 )ÚSocketAttributeaý  
    .. attribute:: family
        :type: socket.AddressFamily

        the address family of the underlying socket

    .. attribute:: local_address
        :type: tuple[str, int] | str

        the local address the underlying socket is connected to

    .. attribute:: local_port
        :type: int

        for IP based sockets, the local port the underlying socket is bound to

    .. attribute:: raw_socket
        :type: socket.socket

        the underlying stdlib socket object

    .. attribute:: remote_address
        :type: tuple[str, int] | str

        the remote address the underlying socket is connected to

    .. attribute:: remote_port
        :type: int

        for IP based sockets, the remote port the underlying socket is connected to
    r   r6   r   Úlocal_addressr,   Ú
local_portr)   Ú
raw_socketÚremote_addressÚremote_portN)Ú__name__Ú
__module__r4   Ú__doc__r   r6   Ú__annotations__rE   rF   rG   rH   rI   rA   rA   rA   rB   rD   c   s   
  rD   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 ©N)Ú_raw_socketr6   rA   ©ÚselfrA   rB   Ú<lambda>’   s    z2_SocketProvider.extra_attributes.<locals>.<lambda>c                     s   ˆ ˆj  ¡ ƒS rQ   ©rR   r9   rA   )ÚconvertrT   rA   rB   rU   “   s    ÿc                     s   ˆ j S rQ   )rR   rA   rS   rA   rB   rU   –   ó    c                     ó   ˆ S rQ   rA   rA   )ÚpeernamerA   rB   rU   Ÿ   ó    c                     s   ˆ j  ¡ d S )Nr   rV   rA   rS   rA   rB   rU   £   s   r   c                     rY   rQ   rA   rA   )rI   rA   rB   rU   ¨   r[   )Z_core._socketsrP   rD   r6   rE   rG   rR   r5   r.   rH   r   r7   r8   rF   rI   )rT   Ú
attributesrA   )rW   rZ   rI   rT   rB   Úextra_attributes�   s$   ûÿz _SocketProvider.extra_attributesr)   c                 C  s   d S rQ   rA   rS   rA   rA   rB   rR   ¬   s   z_SocketProvider._raw_socketN)r(   rO   )r(   r)   )rJ   rK   r4   Úpropertyr]   r   rR   rA   rA   rA   rB   rN   Œ   s    rN   c                   @  ó   e Zd ZdZeddd„ƒZdS )	ÚSocketStreamzu
    Transports bytes over a socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r!   r"   r(   c                 Ã  ó$   �t |tjdd�}tƒ  |¡I dH S )aH  
        Wrap an existing socket object or file descriptor as a socket stream.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must already be connected.

        :param sock_or_fd: a socket object or file descriptor
        :return: a socket stream

        T©r   N)rC   r-   ÚSOCK_STREAMr   Zwrap_stream_socket©Úclsr!   r?   rA   rA   rB   Úfrom_socket¹   ó   €zSocketStream.from_socketN)r!   r"   r(   r`   ©rJ   rK   r4   rL   Úclassmethodrf   rA   rA   rA   rB   r`   ²   ó    r`   c                   @  s6   e Zd Zeddd„ƒZeddd„ƒZeddd„ƒZdS )ÚUNIXSocketStreamr!   r"   r(   c                 Ã  ó(   �t |tjtjdd�}tƒ  |¡I dH S )aR  
        Wrap an existing socket object or file descriptor as a UNIX socket stream.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must already be connected.

        :param sock_or_fd: a socket object or file descriptor
        :return: a UNIX socket stream

        Trb   N)rC   r-   rc   ÚAF_UNIXr   Zwrap_unix_stream_socketrd   rA   rA   rB   rf   Ê   s
   €ÿzUNIXSocketStream.from_socketÚmessageÚbytesÚfdsúCollection[int | IOBase]ÚNonec                 Ã  ó   �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)
        NrA   )rT   rn   rp   rA   rA   rB   Úsend_fdsÛ   rX   zUNIXSocketStream.send_fdsÚmsglenr,   Úmaxfdsútuple[bytes, list[int]]c                 Ã  rs   )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)
        NrA   )rT   ru   rv   rA   rA   rB   Úreceive_fdså   rX   zUNIXSocketStream.receive_fdsN)r!   r"   r(   rk   )rn   ro   rp   rq   r(   rr   )ru   r,   rv   r,   r(   rw   )rJ   rK   r4   ri   rf   r   rt   rx   rA   rA   rA   rB   rk   É   s    	rk   c                   @  s:   e Zd ZdZedd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!   r"   r(   c                 Ã  ra   )a  
        Wrap an existing socket object or file descriptor as a socket listener.

        The newly created listener takes ownership of the socket being passed in.

        :param sock_or_fd: a socket object or file descriptor
        :return: a socket listener

        T©r    N)rC   r-   rc   r   Zwrap_listener_socketrd   rA   rA   rB   rf   ÷   s   €zSocketListener.from_socketr`   c                 Ã  rs   )zAccept an incoming connection.NrA   rS   rA   rA   rB   Úaccept  rX   zSocketListener.acceptNÚhandlerúCallable[[SocketStream], Any]Ú
task_groupúTaskGroup | Nonerr   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_groupT)Ú r€   r   Úenter_async_contextr{   Z
start_soon)rT   r|   r~   r€   ÚstackÚstreamrA   rA   rB   Úserve  s   €þüzSocketListener.serve)r!   r"   r(   ry   )r(   r`   rQ   )r|   r}   r~   r   r(   rr   )	rJ   rK   r4   rL   ri   rf   r   r{   r…   rA   rA   rA   rB   ry   ð   s    ýry   c                   @  s(   e Zd ZdZeddd„ƒZddd„ZdS )Ú	UDPSocketz{
    Represents an unconnected UDP socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r!   r"   r(   c                 Ã  ra   )aI  
        Wrap an existing socket object or file descriptor as a UDP socket.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must be bound to a local address.

        :param sock_or_fd: a socket object or file descriptor
        :return: a UDP socket

        Trz   N)rC   r-   Ú
SOCK_DGRAMr   Zwrap_udp_socketrd   rA   rA   rB   rf   #  rg   zUDPSocket.from_socketÚdataro   ÚhostÚstrÚportr,   rr   c                 Ã  s   �|   |||ff¡I dH S )z^
        Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, (host, port))).

        N©Úsend)rT   rˆ   r‰   r‹   rA   rA   rB   Úsendto2  s   €zUDPSocket.sendtoN)r!   r"   r(   r†   )rˆ   ro   r‰   rŠ   r‹   r,   r(   rr   ©rJ   rK   r4   rL   ri   rf   rŽ   rA   rA   rA   rB   r†     s
    r†   c                   @  r_   )	ÚConnectedUDPSocketzy
    Represents an connected UDP socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r!   r"   r(   c                 Ã  ra   )aV  
        Wrap an existing socket object or file descriptor as a connected UDP socket.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must already be connected.

        :param sock_or_fd: a socket object or file descriptor
        :return: a connected UDP socket

        Trb   N)rC   r-   r‡   r   Zwrap_connected_udp_socketrd   rA   rA   rB   rf   A  s   €ýzConnectedUDPSocket.from_socketN)r!   r"   r(   r�   rh   rA   rA   rA   rB   r�   :  rj   r�   c                   @  s(   e Zd ZdZeddd„ƒZddd„ZdS )ÚUNIXDatagramSocketz…
    Represents an unconnected Unix datagram socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r!   r"   r(   c                 Ã  s$   �t |tjtjƒ}tƒ  |¡I dH S )a'  
        Wrap an existing socket object or file descriptor as a UNIX datagram
        socket.

        The newly created socket wrapper takes ownership of the socket being passed in.

        :param sock_or_fd: a socket object or file descriptor
        :return: a UNIX datagram socket

        N)rC   r-   r‡   rm   r   Zwrap_unix_datagram_socketrd   rA   rA   rB   rf   ^  s   €zUNIXDatagramSocket.from_socketrˆ   ro   ÚpathrŠ   rr   c                 Ã  s   �|   ||f¡I dH S )zCAlias for :meth:`~.UnreliableObjectSendStream.send` ((data, path)).NrŒ   )rT   rˆ   r’   rA   rA   rB   rŽ   p  s   €zUNIXDatagramSocket.sendtoN)r!   r"   r(   r‘   )rˆ   ro   r’   rŠ   r(   rr   r�   rA   rA   rA   rB   r‘   U  s
    r‘   c                   @  r_   )	ÚConnectedUNIXDatagramSocketz‚
    Represents a connected Unix datagram socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r!   r"   r(   c                 Ã  rl   )ar  
        Wrap an existing socket object or file descriptor as a connected UNIX datagram
        socket.

        The newly created socket wrapper takes ownership of the socket being passed in.
        The existing socket must already be connected.

        :param sock_or_fd: a socket object or file descriptor
        :return: a connected UNIX datagram socket

        Trb   N)rC   r-   r‡   rm   r   Z#wrap_connected_unix_datagram_socketrd   rA   rA   rB   rf   |  s
   €ÿz'ConnectedUNIXDatagramSocket.from_socketN)r!   r"   r(   r“   rh   rA   rA   rA   rB   r“   u  rj   r“   )r!   r"   r#   r$   r%   r&   r   r'   r    r'   r(   r)   )8Ú
__future__r   r/   r-   Úabcr   Úcollections.abcr   r   r   Ú
contextlibr   Úior   Ú	ipaddressr	   r
   r   Útypingr   r   r   Z_core._eventloopr   Z_core._typedattrr   r   r   Z_streamsr   r   r   Z_tasksr   rŠ   r   rM   Útupler,   r   r   ro   r   r   r   r:   rC   rD   rN   r`   rk   ry   r†   r�   r‘   r“   rA   rA   rA   rB   Ú<module>   sH    ýúE)&',
ÿ 