o
    m=8j&                     @   s   U d dl Z d dlZd dlZd dlmZmZmZ ddlmZm	Z	 dZ
zd dlZeejdZW n ey:   dZdZY nw ejejB ZejejB ZejZeedrTeejM ZG d	d
 d
eZG dd deZG dd dZeeeB  ZerueneZeed< dS )    N)AnyFinalOptional   )AbstractResolverResolveResult)ThreadedResolverAsyncResolverDefaultResolvergetaddrinfoFAI_MASKc                
   @   s\   e Zd ZdZddejdB ddfddZdejfde	d	e
d
ejdee fddZdddZdS )r   zThreaded resolver.

    Uses an Executor for synchronous getaddrinfo() calls.
    concurrent.futures.ThreadPoolExecutor is used by default.
    Nloopreturnc                 C   s   |pt  | _d S N)asyncioget_running_loop_loop)selfr    r   W/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/aiohttp/resolver.py__init__"   s   zThreadedResolver.__init__r   hostportfamilyc                    s   | j j||tj|tdI d H }g }|D ]I\}}}}}|tjkrEt|dk r'q|d r<| j |tI d H \}	}
t	|
}n|d d \}	}n|tj
ksLJ |\}	}|t||	|||td q|S )N)typer   flags      hostnamer   r   r   protor   )r   r   socketSOCK_STREAM_AI_ADDRCONFIGAF_INET6lengetnameinfo_NAME_SOCKET_FLAGSintAF_INETappendr   _NUMERIC_SOCKET_FLAGS)r   r   r   r   infoshosts_r    addressresolved_host_portr   r   r   resolve%   s@   

zThreadedResolver.resolvec                    s   d S r   r   r   r   r   r   closeQ   s   zThreadedResolver.closer   r   N)__name__
__module____qualname____doc__r   AbstractEventLoopr   r!   r)   strr(   AddressFamilylistr   r2   r4   r   r   r   r   r      s    
,r   c                   @   s   e Zd ZdZ	ddejdB dededdfddZd	ej	fd
e
dedejdee fddZd	ej	fd
e
dededeee
ef  fddZdddZdS )r	   z9Use the `aiodns` package to make asynchronous DNS lookupsNr   argskwargsr   c                 O   sx   t d u rtd|pt | _d | _|s|r!t j|i || _d S t | _| j	| | j| _t
| jds:| j| _d S d S )Nz Resolver requires aiodns librarygethostbyname)aiodnsRuntimeErrorr   r   r   _managerDNSResolver	_resolver_DNSResolverManagerget_resolverhasattr_resolve_with_queryr2   )r   r   r>   r?   r   r   r   r   X   s   zAsyncResolver.__init__r   r   r   r   c                    sB  z| j j||tj|tdI d H }W n" tjjy4 } zt|j	dkr(|j	d nd}t
d ||d }~ww g }|jD ]]}|j}	|jtjkrvt|	dkrj|	d rj| j |	d dg|	dd  R tI d H }
|
j}n|	d d}|	d }n|jtjks~J |	d d}|	d }|t||||jdtd q:|st
d d|S )N)r   r   r   r   r   DNS lookup failedr   r   asciir   )rE   r   r!   r"   r#   rA   errorDNSErrorr%   r>   OSErrornodesaddrr   r$   r&   decoder'   noder)   r*   r   r+   )r   r   r   r   respexcmsgr-   rR   r/   resultr0   r   r   r   r2   q   sT   



zAsyncResolver.resolvec           
   
      s   |t jkrdnd}z| j||I d H }W n" tjjy8 } zt|jdkr,|jd nd}t	d ||d }~ww g }|D ]}	|
||	j||dt jd q=|sUt	d d|S )NAAAAAr   rJ   r   r   )r!   r$   rE   queryrA   rL   rM   r%   r>   rN   r*   r   AI_NUMERICHOST)
r   r   r   r   qtyperS   rT   rU   r-   rrr   r   r   rI      s.   
z!AsyncResolver._resolve_with_queryc                    sF   | j r| j | | j d | _ d | _d S | jd ur| j  d | _d S r   )rC   release_resolverr   rE   cancelr3   r   r   r   r4      s   


zAsyncResolver.closer   r5   )r6   r7   r8   r9   r   r:   r   r   r!   r)   r;   r(   r<   r=   r   r2   dictrI   r4   r   r   r   r   r	   U   sB    

3
r	   c                       sn   e Zd ZU dZdZed  ed< d fddZdddZd	d
de	j
ddfddZd	d
de	j
ddfddZ  ZS )rF   zManager for aiodns.DNSResolver objects.

    This class manages shared aiodns.DNSResolver instances
    with no custom arguments across different event loops.
    N	_instancer   c                    s(   | j d u rt | | _ | j   | j S r   )r`   super__new___init)cls	__class__r   r   rb      s   

z_DNSResolverManager.__new__c                 C   s   t  | _d S r   )weakrefWeakKeyDictionary
_loop_datar3   r   r   r   rc      s   z_DNSResolverManager._initclientr	   r   zaiodns.DNSResolverc                 C   sJ   || j vrtj|d}t }||f| j |< n| j | \}}|| |S )a&  Get or create the shared aiodns.DNSResolver instance for a specific event loop.

        Args:
            client: The AsyncResolver instance requesting the resolver.
                   This is required to track resolver usage.
            loop: The event loop to use for the resolver.
        )r   )ri   rA   rD   rg   WeakSetadd)r   rj   r   resolver
client_setr   r   r   rG      s   

z _DNSResolverManager.get_resolverc                 C   sN   | j |}|du rdS |\}}|| |s%|dur|  | j |= dS dS )zRelease the resolver for an AsyncResolver client when it's closed.

        Args:
            client: The AsyncResolver instance to release.
            loop: The event loop the resolver was using.
        N)ri   getdiscardr^   )r   rj   r   current_loop_datarm   rn   r   r   r   r]      s   

z$_DNSResolverManager.release_resolver)r   rF   r5   )r6   r7   r8   r9   r`   r   __annotations__rb   rc   r   r:   rG   r]   __classcell__r   r   re   r   rF      s&   
 

rF   r
   ) r   r!   rg   typingr   r   r   abcr   r   __all__rA   rH   rD   aiodns_defaultImportErrorrZ   AI_NUMERICSERVr+   NI_NUMERICHOSTNI_NUMERICSERVr'   AI_ADDRCONFIGr#   r   r   r	   rF   r   _DefaultTyper
   rr   r   r   r   r   <module>   s.   
 

:xC