
    h78jk                        U d Z ddlZddlZddlZddlZddlZddlZddlmZm	Z	 ddl
Z
	 ddlZn# e$ r dZY nw xY wddlmZ ddlmZ ddlm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mZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+ erddl,m-Z-  ej.        e/          Z0de1de2e1         fdZ3g dZ4g Z5e2e1         e6d<   e4D ] Z7e58                     e3e7                     !dZ9 G d de          Z: G d d          Z;dS )0libp2p DHT client for distributed cache network.    N)TYPE_CHECKINGAny)new_host)create_new_key_pair)	TProtocol)kad_dht)DHTMode)PublicKeyValidator)NamespacedValidator	Validator)CircuitV2ProtocolCircuitV2Transport)RelayConfig)RelayLimits)Mplex)info_from_p2p_addr)get_available_interfaces)	Multiaddr)IHostmultiaddr_strreturnc                 .   	 |                      d          }d}t          |          D ].\  }}|dk    r#|dz   t          |          k     r||dz            } n/|s| gS t          t                              d           | gS t          j                            d| d          }g }|D ]U}|j        D ]K}|	                    dd	
          }	|	
                    d          r|                    |	dd                    LV|r|S | gS # t          $ r | gcY S w xY w)aM  Resolve /dnsaddr/ multiaddrs into concrete addresses using DNS TXT records.

    Follows libp2p dnsaddr specification:
    - Queries TXT records at _dnsaddr.<domain>
    - Extracts all records starting with "dnsaddr="
    - Gracefully falls back to original address on any failure

    Requires dnspython for full functionality.
    /Ndnsaddr   z4dnspython not installed, skipping dnsaddr resolutionz	_dnsaddr.TXTzutf-8replace)errorszdnsaddr=   )split	enumeratelendnsloggerdebugresolverresolvestringsdecode
startswithappend	Exception)
r   partsdnsaddr_domainipartanswersresultsrdata
txt_stringdecodeds
             ^/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/ddgs/dht/libp2p_client.py_resolve_dnsaddrr8   '   sq    ##C(( '' 	 	GAty  QUSZZ%7%7!&q1u 	#!?";LLOPPP!?" ,&&'C>'C'CUKK 	0 	0E#m 0 0
$++GI+FF%%j11 0NN7122;///0
  	N   s%   AD #D  B D D DD)zO/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJNzO/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTazO/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75NbzO/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwtzO/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJBOOTSTRAP_NODES
   c                   F    e Zd ZdZdededdfdZdedee         defdZ	dS )	DDGSValidatorz#Validator for the 'ddgs' namespace.keyvaluer   Nc                 ,    |sd}t          |          dS )zValidate a key-value pair.zValue cannot be emptyN)
ValueError)selfr=   r>   msgs       r7   validatezDDGSValidator.validatei   s%     	")CS//!	" 	"    valuesc                     dS )z"Select the best value (first one).r    )rA   r=   rE   s      r7   selectzDDGSValidator.selecto   s    qrD   )
__name__
__module____qualname____doc__strbytesrC   listintrH   rG   rD   r7   r<   r<   f   sp        --"C " "$ " " " "# tE{ s      rD   r<   c                   r   e Zd ZdZddedddededed	ed
df
dZed
e	fd            Z
ed
e	fd            Zed
efd            Zed
ee         fd            Zd7dZd8dZd8dZd8dZd8dZd9de	d
efdZd9de	d
efdZd8dZd8dZded
efdZded
efdZd d!d"ed#ede	d
efd$Zdd!d%ede	d
eeeef                  dz  fd&Z	 d:dd!d%ed(eeeef                  d)ede	d
ef
d*Zdd!d%ede	d
eeeef                  dz  fd+Z 	 d:dd!d%ed(eeeef                  d)ede	d
ef
d,Z!d
ee         fd-Z"d
eeeef                  fd.Z#d
ee         fd/Z$ed
efd0            Z%ed
efd1            Z&ed
edz  fd2            Z'ed
ee         fd3            Z(ed
ee         fd4            Z)d9de	d
dfd5Z*d9de	d
dfd6Z+dS );Libp2pClientr   r   T  )listen_port	bootstrapmax_hop_connectionsrefresh_intervalrT   rU   rV   rW   r   Nc          
      `   || _         || _        || _        d | _        d | _        d| _        d | _        d | _        i | _        || _	        d | _
        d | _        t          j                    | _        d | _        t          j                    | _        ddddddddt%          j                    d	| _        d S )NFr           )	total_queriessuccessful_queriesfailed_queries
total_putssuccessful_putsfailed_putstotal_peers_seenquery_latency_sum
started_at)rT   bootstrap_enabledrV   _host_dht_running_host_cm_relay_transport_stored_keys_refresh_interval_dht_thread_trio_token	threadingEvent_start_event_stop_eventLock_locktimemetrics)rA   rT   rU   rV   rW   s        r7   __init__zLibp2pClient.__init__w   s     '!*#6 #'
+/	;?IK!148;?%O--37^%%
 "#  !!$)++

 

rD   c                 ^    | j         d         dk    rdS | j         d         | j         d         z  S )z!Get DHT query success rate (0-1).rZ   r   g      ?r[   rt   rA   s    r7   query_success_ratezLibp2pClient.query_success_rate   s5     <(A--3|01DL4QQQrD   c                 d    | j         d         dk    rdS | j         d         | j         d         z  dz  S )z.Get average DHT query latency in milliseconds.r[   r   rY   ra     rw   rx   s    r7   average_query_latency_msz%Libp2pClient.average_query_latency_ms   s=     <,-22301DLAU4VVZ^^^rD   c                     | j         rt          | j         d          sdS t          d | j         j        j        D                       S )z/Get total number of peers in DHT routing table.routing_tabler   c              3   >   K   | ]}t          |j                  V  d S Nr#   peers.0buckets     r7   	<genexpr>z2Libp2pClient.routing_table_size.<locals>.<genexpr>   s,      SS3v|$$SSSSSSrD   )re   hasattrsumr~   bucketsrx   s    r7   routing_table_sizezLibp2pClient.routing_table_size   sK     y 		? C C 	1SS493J3RSSSSSSrD   c                 |    | j         rt          | j         d          sdgdz  S d | j         j        j        D             S )z0Get peer count per k-bucket (256 buckets total).r~   r      c                 6    g | ]}t          |j                  S rG   r   r   s     r7   
<listcomp>z5Libp2pClient.kbucket_distribution.<locals>.<listcomp>   s"    PPPfFL!!PPPrD   )re   r   r~   r   rx   s    r7   kbucket_distributionz!Libp2pClient.kbucket_distribution   sI     y 		? C C 	39PP	0G0OPPPPrD   r   c                    t          j        d          }t          |          }dt          i}d}	 t	          j        t          j        t          j                  }|                    d           |                                 d}t          
                    d           n*# t          $ r t          
                    d           Y nw xY w| j        dk    rt	          j        t          j        t          j                  }|                    d	           |                                d
         | _        |                                 t          
                    d| j                   g }|                    t!          d| j                              t#          | j                  }|D ]8}t%          |          }	d|	v rd|	vs
|rd|	v rd|	vr|                    |           9|r*|                    t!          d| j                              t          
                    dd |D                        t'          |||d          }
|
                                | _        | j        D ]]}t%          |          }	d|	v rHt-          |	                    d          d
                             d          d                   | _         n^|
S )zACreate a host with Mplex muxer (default security includes Noise).    z/mplex/6.7.0F)::1r   TzIPv6 loopback is functionalz&IPv6 is not available, using IPv4 onlyr   )	127.0.0.1r   r   zAuto-selected port: %d/ip4/127.0.0.1/tcp/z/ip4/r   z/ip6/r   z/ip6/::1/tcp/zUsing listen addresses: %sc                 ,    g | ]}t          |          S rG   rM   )r   as     r7   r   z-Libp2pClient._create_host.<locals>.<listcomp>   s    3Q3Q3QqCFF3Q3Q3QrD   MPLEX)key_pair	muxer_optlisten_addrsmuxer_preference/tcp/r   )secretstoken_bytesr   r   socketAF_INET6SOCK_STREAMbindcloser%   r&   OSErrorrT   AF_INETgetsocknamer,   r   r   rM   r   	get_addrs_listen_addrsrP   r!   )rA   secretr   r   has_ipv6sockr   	all_addrsaddraddr_strhosts              r7   _create_hostzLibp2pClient._create_host   s   $R((&v.. '5e%<	 	C=&2DEEDIIj!!!JJLLLHLL67777 	C 	C 	CLLABBBBB	C q  =1CDDDII&'''#//11!4DJJLLLLL143CDDD  	I&ND<L&N&NOOPPP -T-=>>	 	* 	*D4yyH8##8(C(C )D$00U(5J5J##D))) 	O	*L$:J*L*L M MNNN13Q3QL3Q3Q3QRRR%$	
 
 
 "^^-- & 	 	D4yyH$00#&x~~g'>'>q'A'G'G'L'LQ'O#P#P  1 s   A.B $CCc                    K   | j         sdS t          t                      t                      d          }t	          j        | j         t          j        t          d          |          | _	        dS )z#Set up DHT instance with validator.N)pkddgsz/ddgs)r   modeprotocol_prefix	validator)
rd   r   r   r<   r	   KadDHTr
   SERVERr   re   )rA   r   s     r7   
_setup_dhtzLibp2pClient._setup_dht   st      z 	F'(**% 
 
	 N%g..	
 
 
			rD   c                   K   | j         rt          j        | j                   d{V  | j         sdS | j        5  t          | j                                                  }ddd           n# 1 swxY w Y   t          	                    dt          |                     |D ]T\  }\  }}	 |                     |||           "# t          $ r&}t          	                    d||           Y d}~Md}~ww xY w| j         dS dS )z4Background task to refresh DHT records periodically.NzRefreshing %d DHT records)ttlz#Failed to refresh DHT record %s: %r)rf   triosleeprj   rr   rO   ri   itemsr%   r&   r#   setr-   )rA   stored_itemsr=   r3   r   exs         r7   _run_refresh_taskzLibp2pClient._run_refresh_task  s     m 	Q*T3444444444=  ? ?#D$5$;$;$=$=>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? LL4c,6G6GHHH'3 Q Q#^gsQHHS'sH3333  Q Q QLL!FRPPPPPPPPQ m 	Q 	Q 	Q 	Q 	Qs)   'A,,A03A0*C
C3C..C3c                 (  K   ddl m} t          j                    | _        t          j                    4 d{V }| j        r |                    |j	        | j                   |                    | j
                   | j        r<t                              dd | j                                        D                        t
          j                            | j        j                   d{V  ddd          d{V  dS # 1 d{V swxY w Y   dS )zRun main DHT event loop.r   )AnyIOManagerNz$DHT client started, listening on: %sc                 ,    g | ]}t          |          S rG   r   r   r   s     r7   r   z/Libp2pClient._run_main_loop.<locals>.<listcomp>0  s    BBB4SYYBBBrD   )libp2p.tools.anyio_servicer   rm   rn   rp   r   open_nurseryre   
start_soonrun_servicer   rd   r%   infor   	to_threadrun_syncwait)rA   r   nurserys      r7   _run_main_loopzLibp2pClient._run_main_loop  s     ;;;;;;$?,,$&& 	A 	A 	A 	A 	A 	A 	A'y H""<#;TYGGG t5666z :BB4:+?+?+A+ABBB  
 .))$*:*?@@@@@@@@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	As   B4D
DDc                     d fd}	 t          j        |           n2# t          $ r%}t                              d|           Y d}~nd}~ww xY wd _         j                                          j        r j                                         dS dS # d _         j                                          j        r j                                         w w xY w)zARun Trio event loop in background thread with all DHT operations.r   Nc                  6  K   t           j                                        _        	                                 _        t          dj                  _        j                                        } j        	                    |           4 d {V  j                                        D ]_}t          |          }d|v rJt          |                    d          d                             dd          d                   _         n`t                              dj                                        j                                                    d {V                                   d {V  d_        j                                         j        r                                 d {V                                   d {V  d d d           d {V  n# 1 d {V swxY w Y   d	_        j                                         d _        d _        d _        j                                         d S # d	_        j                                         d _        d _        d _        j                                         w xY w)
Nr   r   r   r   r   )maxsplitz#Host started, peer ID: %s, port: %dTF)r   lowlevelcurrent_trio_tokenrl   r   rd   maxrT   r   runrM   rP   r!   r%   r   get_id_setup_relayr   rf   ro   r   rc   _connect_bootstrapr   re   rh   ri   clear)r   r   r   rA   s      r7   _mainz%Libp2pClient._run_trio.<locals>._main8  s      #}??AAD'*!..00
#&q$*:#;#;   $z3355:>>,77 0 0 0 0 0 0 0 0 $
 4 4 6 6 " "#&t990H<</28>>'3J3J13M3S3STWbc3S3d3def3g/h/hD,!E = KK EtzGXGXGZGZ\`\lmmm++---------//+++++++++ %)DM %))+++- 8"55777777777 --//////////0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 06 !&!%%'''!
 	(,%!''))))) !&!%%'''!
 	(,%!''))))s2   A,I EG'I '
G11I 4G15I AJzDHT service loop exited: %rFr   N)	r   r   r-   r%   warningrf   ro   r   rp   )rA   r   r   s   `  r7   	_run_triozLibp2pClient._run_trio5  s   *	* *	* *	* *	* *	* *	*X	'HUOOOO 	> 	> 	>NN8"========	> "DM!!### ' $$&&&&&' ' "DM!!### ' $$&&&&'s,    B 
AAB AB AC       @timeoutc                    | j         5  | j        r	 ddd           dS t          j        | j        d          | _        | j                                         | j                            |          r(t          
                    d           	 ddd           dS t                              d|           	 ddd           dS # 1 swxY w Y   dS )zStart the DHT client and connect to the network.

        Args:
            timeout: Maximum time to wait for service to start.

        Returns:
            True if connected to network, False otherwise.

        NT)targetdaemonr   zDHT client startedz%DHT client failed to start within %dsF)rr   rf   rm   Threadr   rk   startro   r   r%   r   r   rA   r   s     r7   r   zLibp2pClient.startn  sJ    Z 	 	} 	 	 	 	 	 	 	 	  )/t~dSSSD""$$$ %%g%66 0111	 	 	 	 	 	 	 	 NNBGLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   	CA/CCC
Cc                 \   K   t           j                            | j        |           d{V S )zAsync wrapper for start() for backwards compatibility.

        Args:
            timeout: Maximum time to wait for service to start.

        Returns:
            True if connected to network, False otherwise.

        N)r   r   r   r   r   s     r7   astartzLibp2pClient.astart  s4       ^,,TZAAAAAAAAArD   c                   K   | j         sdS 	 t          dd| j        | j                  }t          | j         |d          }t	          |          }t          | j         ||          | _        t                              d| j                   dS # t          $ r&}t          
                    d	|           Y d}~dS d}~ww xY w)
z*Set up Circuit Relay v2 for NAT traversal.Ni,  i@B )durationdatamax_circuit_connsmax_reservationsT)limits	allow_hop)r   z1Circuit Relay v2 enabled (max_hop_connections=%d)zFailed to setup relay: %r)rd   r   rV   r   r   r   rh   r%   r   r-   r   )rA   r   relay_protocolrelay_configr   s        r7   r   zLibp2pClient._setup_relay  s     z 	F	< "&":!%!9	  F /
  N 'f555L$6
% %D! KKC(    
  	< 	< 	<NN6;;;;;;;;;	<s   A?B 
B>B99B>c                 H  K   | j         sdS d}t          D ]}	 t          t          |                    }| j                                                             |j        |j        d           | j                             |           d{V  t          
                    d|j                   |dz  }# t          $ r&}t                              d||           Y d}~d}~ww xY w|dk    rt                              d           dS t          
                    d|           dS )	zConnect to bootstrap nodes.Nr   rS   zConnected to bootstrap: %sr   zBootstrap %s failed: %sz(Failed to connect to any bootstrap nodesz,Successfully connected to %d bootstrap nodes)rd   r9   r   r   get_peerstore	add_addrspeer_idaddrsconnectr%   r   r-   r&   r   )rA   connected_countr   peerr   s        r7   r   zLibp2pClient._connect_bootstrap  sC     z 	F# 	B 	BDB))D//::
((**44T\4:tTTTj((.........8$,GGG1$ B B B6bAAAAAAAAB aNNEFFFFFKKFXXXXXs   BB22
C"<CC"	peer_addrc                       j         r j        r j        sdS 	 dt          f fd}                     |d          }||ndS # t
          $ r'}t                              d|           Y d}~dS d}~ww xY w)zConnect to a specific peer.

        Args:
            peer_addr: The multiaddress of the peer to connect to.

        Returns:
            True if connected successfully.

        Fr   c                    K   t          t                              } j                                                            | j        | j        d           j                            |            d {V  j        j	        
                    | j                   d {V  t                              d| j                   dS )NrS   zConnected to peer: %sT)r   r   rd   r   r   r   r   r   re   r~   add_peerr%   r   )r   r   rA   s    r7   _connectz+Libp2pClient.connect_peer.<locals>._connect  s      ))I*>*>??
((**44T\4:tTTTj((.........i-66t|DDDDDDDDD3T\BBBtrD   g      @r   Nz Failed to connect to peer %s: %s)rf   rd   re   bool_run_in_trior-   r%   r   )rA   r   r  resultr   s   ``   r7   connect_peerzLibp2pClient.connect_peer  s     } 	DJ 	di 	5	;D        &&x&==F
 $/66U:	  	 	 	NN=y"MMM55555	s   %A 
A7A22A7c                 \   K   t           j                            | j        |           d{V S )zAsync wrapper for connect_peer() for backwards compatibility.

        Args:
            peer_addr: The multiaddress of the peer to connect to.

        Returns:
            True if connected successfully.

        N)r   r   r   r  )rA   r   s     r7   aconnect_peerzLibp2pClient.aconnect_peer  s5       ^,,T->	JJJJJJJJJrD   g      >@r   funcargsc                    | j         r| j        dS dt          j                    dfd}t          j                            || j                                       dz              S )zARun an async function in the Trio event loop from another thread.Nr   c                     K   	 t          j                  5      d {V d d d            n# 1 swxY w Y   n# t          $ r d Y nw xY w                                 d S #                                  w xY wr   )r   
fail_afterr-   r   )r	  doner  r  r   s   r7   _runnerz*Libp2pClient._run_in_trio.<locals>._runner  s      _W-- / /#'4;......F/ / / / / / / / / / / / / / /    








s>   = 1= 5= 5= A% A	A% AA% %A;)
trio_tokeng      ?r   )rf   rl   rm   rn   r   from_threadr   r   )rA   r  r   r	  r  r  r  s    ``` @@r7   r  zLibp2pClient._run_in_trio  s    } 	 0 84  	 	 	 	 	 	 	 	 	 	 	W1ABBB		'C-   rD   r=   c                     j         r j        sdS t          j                    }d}	  j        dxx         dz  cc<   dt          t
          t          t          f                  dz  f fd}                     |          }|du}||r? j        dxx         dz  cc<    j        d	xx         t          j                    |z
  z  cc<   S  j        d
xx         dz  cc<   S # t          $ r}t                              d|           d}Y d}~|r@ j        dxx         dz  cc<    j        d	xx         t          j                    |z
  z  cc<   dS  j        d
xx         dz  cc<   dS d}~ww xY w# |r? j        dxx         dz  cc<    j        d	xx         t          j                    |z
  z  cc<   n j        d
xx         dz  cc<   w xY w)zGet cached results from the DHT.

        Args:
            key: The cache key (query hash).
            timeout: Timeout in seconds for DHT query.

        Returns:
            List of results or None if not found.

        NFrZ   r   r   c                  B  K   d } t          j                  5 }j                            |            d {V }d d d            n# 1 swxY w Y   |j        rt
                              d           d S |rt          |t                    rt          j
        |d d d           }t          |t                    rad|v r]|                    dd          }|                    dd	          }t          j                    |z
  |k    rd S |                    d          S d S )
N/ddgs/zDHT get timed out for %sc                     d S r   rG   )_s    r7   <lambda>z0Libp2pClient.get.<locals>._get.<locals>.<lambda>&  s    t rD   )parse_constantobject_hookobject_pairs_hookr3   	timestampr   r   @8  )r   move_on_afterre   	get_valuecancelled_caughtr%   r&   
isinstancerN   jsonloadsdictgetrs   )	dht_keycancel_scoper  r   	stored_atr   r=   rA   r   s	         r7   _getzLibp2pClient.get.<locals>._get  sz     (3..'00 @L#'9#6#6w#?#???????F@ @ @ @ @ @ @ @ @ @ @ @ @ @ @0  LL!;SAAA4 3j77 3:f^^Y]quvvvD!$-- 3)t2C2C$(HH[!$<$<	"hhue449;;2S88#'4#xx	222ts   !A

AAr   r[   ra   r\   zDHT get failed for %s: %r)rf   re   rs   rt   rO   r"  rM   r   r  r-   r%   r&   )rA   r=   r   
start_timesuccessr'  r  r   s   ```     r7   r#  zLibp2pClient.get
  sv    } 	DI 	4Y[[
 	4L)))Q.)))T#s(^ 4t ;        " &&tW&==FD(G  41222a72220111TY[[:5MM1111-...!3....  	 	 	LL4c2>>>G444 41222a72220111TY[[:5MM11111-...!3.....	
  41222a72220111TY[[:5MM1111-...!3.......s+   A C! !
E++E&	E. &E++E. .AGr  r3   r   c                     j         r j        sdS 	  j        dxx         dz  cc<   dt          f fd}                     |          }|r j        dxx         dz  cc<   dS  j        d	xx         dz  cc<   dS # t
          $ r<}t                              d
|            j        d	xx         dz  cc<   Y d}~dS d}~ww xY w)a?  Store results in the DHT.

        Args:
            key: The cache key (query hash).
            results: The search results to cache.
            ttl: Time to live in seconds (default 4 hours).
            timeout: Timeout in seconds for DHT query.

        Returns:
            True if stored successfully.

        Fr]   r   r   c                    K   t          j                     } | 	d}t          j        |dd                                          }d }t	          j                  5 }j        !j                            ||           d {V  d d d            n# 1 swxY w Y   |j        rt          
                    d           dS j        5  	fj        <   d d d            n# 1 swxY w Y   dS )N)r3   r  r   F)ensure_ascii	allow_nanr  zDHT set timed out for %sT)rs   r   dumpsencoder   r  re   	put_valuer  r%   r&   rr   ri   )
r  r   r>   r$  r%  r=   r3   rA   r   r   s
        r7   _setzLibp2pClient.set.<locals>._setW  s      IKK	&!* 
 
4euMMMTTVV(3..'00 BLy,"i11'5AAAAAAAAAB B B B B B B B B B B B B B B  0 !LL!;SAAA 5 Z < <.5s^D%c*< < < < < < < < < < < < < < <ts$   )BBB
C##C'*C'r   r^   Tr_   zDHT set failed for %s: %rN)rf   re   rt   r  r  r-   r%   r&   )rA   r=   r3   r   r   r1  r  r   s   `````   r7   r   zLibp2pClient.set=  sG   ( } 	DI 	5!	L&&&!+&&&          * &&tW&==F .///14///tL'''1,'''5 	 	 	LL4c2>>>L'''1,'''55555	s   AB -B 
C
1CC
c                `    K   t           j                             fd           d{V S )zAsync wrapper for get() for backwards compatibility.

        Args:
            key: The cache key (query hash).
            timeout: Timeout in seconds for DHT query.

        Returns:
            List of results or None if not found.

        c                  2                                    S Nr   )r#  )r=   rA   r   s   r7   r  z#Libp2pClient.aget.<locals>.<lambda>  s    TXXc7X5S5S rD   Nr   r   r   )rA   r=   r   s   ```r7   agetzLibp2pClient.agetw  sC       ^,,-S-S-S-S-S-STTTTTTTTTrD   c                h    K   t           j                             fd           d{V S )aZ  Async wrapper for set() for backwards compatibility.

        Args:
            key: The cache key (query hash).
            results: The search results to cache.
            ttl: Time to live in seconds (default 4 hours).
            timeout: Timeout in seconds for DHT query.

        Returns:
            True if stored successfully.

        c                  6                                    S r4  )r   )r=   r3   rA   r   r   s   r7   r  z#Libp2pClient.aset.<locals>.<lambda>  s    TXXc7CY`X5a5a rD   Nr5  )rA   r=   r3   r   r   s   `````r7   asetzLibp2pClient.aset  sK      ( ^,,-a-a-a-a-a-a-a-abbbbbbbbbrD   c                       j         r j        sg S 	 dt          t                   f fd}                     |d          }||ng S # t
          $ r'}t                              d|           g cY d}~S d}~ww xY w)z`Find other peers in the network.

        Returns:
            List of peer addresses.

        r   c                  v   K   j                                                                         } d | D             S )Nc                 ,    g | ]}t          |          S rG   r   )r   ps     r7   r   z@Libp2pClient.find_peers.<locals>._find_peers.<locals>.<listcomp>  s    ...1A...rD   )rd   r   peer_ids)r   rA   s    r7   _find_peersz,Libp2pClient.find_peers.<locals>._find_peers  s:      
0022;;==......rD   g      @r   NzDHT find_peers failed: %r)rf   rd   rO   rM   r  r-   r%   r&   )rA   r?  r  r   s   `   r7   
find_peerszLibp2pClient.find_peers  s     } 	DJ 	I	8/tCy / / / / / / &&{C&@@F
 $/66R7	  	 	 	LL4b999IIIIII	s   /A 
A9A4.A94A9c                     | j         rt          | j         d          sg S g }|                    d t          | j         j        j                  D                        |S )zGet all peers from routing table with complete metadata.

        Returns:
            List of peer dictionaries with metadata.

        r~   c           
   3      K   | ]n\  }}|j         D ]a}t          |          |t          |d           r|j        ndt          |d          r
|j        dz  ndt          |d          r|j        nddV  bodS )	last_seenNlatencyr{   agent_version)r   xor_distancerC  
latency_msrE  )r   rM   r   rC  rD  rE  )r   
bucket_idxr   r   s       r7   r   z-Libp2pClient.get_neighbors.<locals>.<genexpr>  s       

 

 #
F

 

  t99 */6t[/I/IST^^t5<T95M5MWdlT11SW7>t_7U7U!_!3!3[_ 

 

 

 

 

 

 

rD   )re   r   extendr"   r~   r   )rA   r   s     r7   get_neighborszLibp2pClient.get_neighbors  sv     y 		? C C 	I&( 

 

 '0	0G0O&P&P

 

 

 
	
 
	
 
	
 rD   c                 Z   K   t           j                            | j                   d{V S )z{Async wrapper for find_peers() for backwards compatibility.

        Returns:
            List of peer addresses.

        N)r   r   r   r@  rx   s    r7   afind_peerszLibp2pClient.afind_peers  s2       ^,,T_=========rD   c                     | j         S )zCheck if the client is running.)rf   rx   s    r7   
is_runningzLibp2pClient.is_running  s     }rD   c                     | j         S )zGet the listen port.)rT   rx   s    r7   portzLibp2pClient.port  s     rD   c                 `    | j         r&t          | j                                                   ndS )zGet the peer ID of this node.N)rd   rM   r   rx   s    r7   r   zLibp2pClient.peer_id  s,     ,0:?s4:$$&&'''4?rD   c                     | j         r[	 d | j                                         D             }|r|S n2# t          $ r%}t                              d|           Y d}~nd}~ww xY wd| j         gS )z&Get the listen addresses of this node.c                 ,    g | ]}t          |          S rG   r   r   s     r7   r   z-Libp2pClient.listen_addrs.<locals>.<listcomp>  s    FFFtTFFFrD   z Failed to get host addresses: %rNr   )rd   r   r-   r%   r&   rT   )rA   r   r   s      r7   r   zLibp2pClient.listen_addrs  s     : 	EEFFtz/C/C/E/EFFF ! L! E E E?DDDDDDDDE 9d&68899s   &1 
A AA c                 <      j         sg S  fd j        D             S )z9Get full peer addresses with /p2p/ suffix for connecting.c                 (    g | ]}| d j          S )z/p2p/)r   )r   r   rA   s     r7   r   z+Libp2pClient.peer_addrs.<locals>.<listcomp>  s)    SSSX800$,00SSSrD   )r   r   rx   s   `r7   
peer_addrszLibp2pClient.peer_addrs  s1     | 	ISSSSARSSSSrD   c                 ,   | j         5  | j        s	 ddd           dS d| _        | j        | j                                         | j        r| j                            |           d| _        d| _        d| _        ddd           dS # 1 swxY w Y   dS )zlStop the DHT client.

        Args:
            timeout: Maximum time to wait for service to stop.

        NFr   )rr   rf   rp   r   rk   joinrl   r   s     r7   stopzLibp2pClient.stop  s    Z 	$ 	$= 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ "DM + $$&&&  7 %%g%666#D#D#D!	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   	B	AB		BBc                 `    K   t           j                             fd           d{V  dS )zAsync wrapper for stop() for backwards compatibility.

        Args:
            timeout: Maximum time to wait for service to stop.

        c                  0                                    S r4  )rY  r   s   r7   r  z$Libp2pClient.astop.<locals>.<lambda>  s    diii.H.H rD   Nr5  r   s   ``r7   astopzLibp2pClient.astop  sE       n%%&H&H&H&H&HIIIIIIIIIIIrD   )r   r   r   )r   )r  ),rI   rJ   rK   rL   DEFAULT_MAX_HOP_CONNECTIONSrP   r  ru   propertyfloatry   r|   r   rO   r   r   r   r   r   r   r   r   r   r   rM   r  r  r   r  r"  r#  r   r6  r9  r@  rJ  rL  rN  rP  r   r   rV  rY  r\  rG   rD   r7   rR   rR   t   s       ::
 #> $#
 #
 #
 #
 	#

 !#
 #
 
#
 #
 #
 #
J RE R R R XR _% _ _ _ X_ TC T T T XT Qd3i Q Q Q XQ@ @ @ @D
 
 
 
$Q Q Q Q&A A A A,7' 7' 7' 7'r U T    0
B 
BE 
BD 
B 
B 
B 
B!< !< !< !<FY Y Y Y*;c ;d ; ; ; ;<
KS 
KT 
K 
K 
K 
K DH    S 5 C    , 14 14 14 14s 14 14T#s(^8Lt8S 14 14 14 14n 	8 8 8 88 d38n%8 	8 8 
8 8 8 8t 8; U U Uc Uu UtDcN?SVZ?Z U U U U" 	c c c cc d38n%c 	c c 
c c c c,8DI 8 8 8 8.tDcN3    0>49 > > > > D    X  c       X  @t @ @ @ X@ :d3i : : : X: TDI T T T XT$ $E $D $ $ $ $2J J5 J4 J J J J J JrD   rR   )<rL   r   loggingr   r   rm   rs   typingr   r   r   dns.resolverr$   ImportErrorlibp2pr   libp2p.crypto.secp256k1r   libp2p.custom_typesr   libp2p.kad_dhtr	   libp2p.kad_dht.kad_dhtr
   libp2p.records.pubkeyr   libp2p.records.validatorr   r   libp2p.relay.circuit_v2r   r   libp2p.relay.circuit_v2.configr   !libp2p.relay.circuit_v2.resourcesr   libp2p.stream_muxer.mplex.mplexr   libp2p.tools.utilsr   libp2p.utils.address_validationr   	multiaddrr   
libp2p.abcr   	getLoggerrI   r%   rM   rO   r8   _RAW_BOOTSTRAP_NODESr9   __annotations__noderI  r]  r<   rR   rG   rD   r7   <module>rw     s   6 6 6          % % % % % % % %    
CCC       7 7 7 7 7 7 ) ) ) ) ) ) " " " " " " * * * * * * 4 4 4 4 4 4 C C C C C C C C I I I I I I I I 6 6 6 6 6 6 9 9 9 9 9 9 1 1 1 1 1 1 1 1 1 1 1 1 D D D D D D       !      		8	$	$*C *DI * * * *^     c     3 3D++D112222      I   b
J b
J b
J b
J b
J b
J b
J b
J b
J b
Js   . 88