o
    <^öhÊ3  ã                   @  s,  U d dl mZ d dl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j#dkrsd dlm$Z$ nd dl%m$Z$ ee&eef Z'de(d< e)e&e*f Z+de(d< ee+e&f Z,de(d< e)e-e+f Z.de(d< e)e-e&f Z/de(d< edƒZ0ej1fdddœd:d&d'„Z2G d(d)„ d)eƒZ3G d*d+„ d+eƒZ4G d,d-„ d-ee4ƒZ5G d.d/„ d/e5ƒZ6G d0d1„ d1ee5 e4ƒZ7G d2d3„ d3e e. e4ƒZ8G d4d5„ d5e e- e4ƒZ9G d6d7„ d7e e/ e4ƒZ:G d8d9„ d9e e- e4ƒZ;dS );é    )ÚannotationsN)Úabstractmethod)ÚCallableÚ
CollectionÚMapping)ÚAsyncExitStack)ÚIOBase)ÚIPv4AddressÚIPv6Address)ÚAddressFamily)ÚAnyÚTypeVarÚUnioné   )Úget_async_backend)ÚTypedAttributeProviderÚTypedAttributeSetÚtyped_attributeé   )Ú
ByteStreamÚListenerÚUnreliableObjectStream)Ú	TaskGroup)é   é
   )Ú	TypeAliasr   Ú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 |rz|jtjtjfv rv| ¡ d }n| ¡ }W n ty†   d }Y nw |st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ÚexcÚ
bound_addr© rE   úR/home/air/websocket/korean/venv/lib/python3.10/site-packages/anyio/abc/_sockets.pyÚ_validate_socket$   sv   
ÿþ

€öÿ
€ÿ€ÿ
ÿÿ
ÿÿ
û
rG   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   r9   r   Úlocal_addressr/   Ú
local_portr,   Ú
raw_socketÚremote_addressÚremote_portN)Ú__name__Ú
__module__r7   Ú__doc__r   r9   Ú__annotations__rI   rJ   rK   rL   rM   rE   rE   rE   rF   rH   i   s   
  rH   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_socketr9   rE   ©ÚselfrE   rF   Ú<lambda>˜   s    z2_SocketProvider.extra_attributes.<locals>.<lambda>c                     s   ˆ ˆj  ¡ ƒS rU   ©rV   r<   rE   )ÚconvertrX   rE   rF   rY   ™   s    ÿc                     s   ˆ j S rU   )rV   rE   rW   rE   rF   rY   œ   ó    c                     ó   ˆ S rU   rE   rE   )ÚpeernamerE   rF   rY   ¥   ó    c                     s   ˆ j  ¡ d S )Nr   rZ   rE   rW   rE   rF   rY   ª   s    r   c                     r]   rU   rE   rE   )rM   rE   rF   rY   ®   r_   )Ú_core._socketsrT   rH   r9   rI   rK   rV   r8   r1   rL   r   r:   r;   rJ   rM   )rX   Ú
attributesrE   )r[   r^   rM   rX   rF   Úextra_attributes“   s&   ûÿ
ÿz _SocketProvider.extra_attributesr,   c                 C  s   d S rU   rE   rW   rE   rE   rF   rV   ²   s   z_SocketProvider._raw_socketN)r+   rS   )r+   r,   )rN   rO   r7   Úpropertyrb   r   rV   rE   rE   rE   rF   rR   ’   s    rR   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)rG   r0   ÚSOCK_STREAMr   Úwrap_stream_socket©Úclsr$   rB   rE   rE   rF   Úfrom_socket¿   ó   €zSocketStream.from_socketN)r$   r%   r+   re   ©rN   rO   r7   rP   Úclassmethodrl   rE   rE   rE   rF   re   ¸   ó    re   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

        Trg   N)rG   r0   rh   ÚAF_UNIXr   Úwrap_unix_stream_socketrj   rE   rE   rF   rl   Ð   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)
        NrE   )rX   ru   rw   rE   rE   rF   Úsend_fdsá   r\   zUNIXSocketStream.send_fdsÚmsglenr/   Úmaxfdsútuple[bytes, list[int]]c                 Ã  rz   )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)
        NrE   )rX   r|   r}   rE   rE   rF   Úreceive_fdsë   r\   zUNIXSocketStream.receive_fdsN)r$   r%   r+   rq   )ru   rv   rw   rx   r+   ry   )r|   r/   r}   r/   r+   r~   )rN   rO   r7   ro   rl   r   r{   r   rE   rE   rE   rF   rq   Ï   s    	rq   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                 Ã  rf   )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)rG   r0   rh   r   Úwrap_listener_socketrj   rE   rE   rF   rl   ý   s   €zSocketListener.from_socketre   c                 Ã  rz   )zAccept an incoming connection.NrE   rW   rE   rE   rF   Úaccept  r\   zSocketListener.acceptNÚhandlerúCallable[[SocketStream], Any]Ú
task_groupúTaskGroup | Nonery   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_group)Ú rˆ   r   Úenter_async_contextrƒ   Ú
start_soon)rX   r„   r†   rˆ   ÚstackÚstreamrE   rE   rF   Úserve  s   €þüzSocketListener.serve)r$   r%   r+   r€   )r+   re   rU   )r„   r…   r†   r‡   r+   ry   )	rN   rO   r7   rP   ro   rl   r   rƒ   rŽ   rE   rE   rE   rF   r€   ö   s    ýr€   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                 Ã  rf   )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

        Tr   N)rG   r0   Ú
SOCK_DGRAMr   Úwrap_udp_socketrj   rE   rE   rF   rl   )  rm   zUDPSocket.from_socketÚdatarv   ÚhostÚstrÚportr/   ry   c                 Ã  s   |   |||ff¡I dH S )z^
        Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, (host, port))).

        N©Úsend)rX   r’   r“   r•   rE   rE   rF   Úsendto8  s   €zUDPSocket.sendtoN)r$   r%   r+   r   )r’   rv   r“   r”   r•   r/   r+   ry   ©rN   rO   r7   rP   ro   rl   r˜   rE   rE   rE   rF   r   "  s
    r   c                   @  rd   )	ÚConnectedUDPSocketzy
    Represents an connected UDP socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r$   r%   r+   c                 Ã  rf   )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

        Trg   N)rG   r0   r   r   Úwrap_connected_udp_socketrj   rE   rE   rF   rl   G  s   €ýzConnectedUDPSocket.from_socketN)r$   r%   r+   rš   rn   rE   rE   rE   rF   rš   @  rp   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)rG   r0   r   rs   r   Úwrap_unix_datagram_socketrj   rE   rE   rF   rl   d  s   €zUNIXDatagramSocket.from_socketr’   rv   Úpathr”   ry   c                 Ã  s   |   ||f¡I dH S )zCAlias for :meth:`~.UnreliableObjectSendStream.send` ((data, path)).Nr–   )rX   r’   rž   rE   rE   rF   r˜   v  s   €zUNIXDatagramSocket.sendtoN)r$   r%   r+   rœ   )r’   rv   rž   r”   r+   ry   r™   rE   rE   rE   rF   rœ   [  s
    rœ   c                   @  rd   )	ÚConnectedUNIXDatagramSocketz‚
    Represents a connected Unix datagram socket.

    Supports all relevant extra attributes from :class:`~SocketAttribute`.
    r$   r%   r+   c                 Ã  rr   )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

        Trg   N)rG   r0   r   rs   r   Ú#wrap_connected_unix_datagram_socketrj   rE   rE   rF   rl   ‚  s
   €ÿz'ConnectedUNIXDatagramSocket.from_socketN)r$   r%   r+   rŸ   rn   rE   rE   rE   rF   rŸ   {  rp   rŸ   )r$   r%   r&   r'   r(   r)   r"   r*   r#   r*   r+   r,   )<Ú
__future__r   r2   r0   ÚsysÚabcr   Úcollections.abcr   r   r   Ú
contextlibr   Úior   Ú	ipaddressr	   r
   r   Útypingr   r   r   Ú_core._eventloopr   Ú_core._typedattrr   r   r   Ú_streamsr   r   r   Ú_tasksr   Úversion_infor   Útyping_extensionsr”   r   rQ   Útupler/   r   r   rv   r   r    r!   r=   rG   rH   rR   re   rq   r€   r   rš   rœ   rŸ   rE   rE   rE   rF   Ú<module>   sP    
ýúE)&',
ÿ 