
    F2j.                        d dl mZ d dlZd dlmZmZmZ ddlmZ ddl	m
Z
mZ eegdf         Zeej        ej        gdf         Z G d dej                  Z G d	 d
ej                  ZdS )    )annotationsN)AnyCallablecast   )events)NetworkAddressQuicConnectionc                      e Zd Z	 d)d*dZd+d	Zd+d
Zd,dZ	 d-d.dZd+dZd+dZ	d+dZ
d+dZd+dZd/dZd0dZd1dZd2d"Zd3d%Zd+d&Zd+d'Zd+d(ZdS )4QuicConnectionProtocolNquicr
   stream_handlerQuicStreamHandler | Nonec                   t          j                    }t          j                    | _        d| _        d | _        || _        |j        | _        i | _	        || _
        i | _        t                      | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        |	|| _        d S d | _        d S )NFc                    d S N cs    \/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/qh3/asyncio/protocol.py<lambda>z1QuicConnectionProtocol.__init__.<locals>.<lambda>#   s    PT     c                    d S r   r   r   s    r   r   z1QuicConnectionProtocol.__init__.<locals>.<lambda>$   s    QU r   c                     d S r   r   r   r   r   r   z1QuicConnectionProtocol.__init__.<locals>.<lambda>%   s    $ r   c                    d S r   r   )rws     r   r   z1QuicConnectionProtocol.__init__.<locals>.<lambda>)   s     r   )asyncioget_running_loopEvent_closed
_connected_connected_waiter_looptime
_loop_time_ping_waiters_quic_stream_readersset_stream_readers_done_timer	_timer_at_transmit_task
_transport_sendto_many_connection_id_issued_handler_connection_id_retired_handler_connection_terminated_handler_stream_handler)selfr   r   loops       r   __init__zQuicConnectionProtocol.__init__   s     '))}>B
)>@
@B.1ee!26'+59<@GK GUn*GU~+BN,+%#1D   #4#4D   r   returnNonec                `    | j                                          |                                  dS )z
        Change the connection ID used to communicate with the peer.

        The previous connection ID will be retired.
        N)r(   change_connection_idtransmitr5   s    r   r;   z+QuicConnectionProtocol.change_connection_id+   s)     	
'')))r   c                `    | j                                          |                                  dS )z'
        Close the connection.
        N)r(   closer<   r=   s    r   r?   zQuicConnectionProtocol.close4   s)     	
r   addrr	   c                    | j                             ||                                            |                                  dS )zt
        Initiate the TLS handshake.

        This method can only be called for clients and a single time.
        nowN)r(   connectr&   r<   )r5   r@   s     r   rD   zQuicConnectionProtocol.connect;   s:     	
4T__%6%6777r   Fis_unidirectionalbool1tuple[asyncio.StreamReader, asyncio.StreamWriter]c                f   K   | j                             |          }|                     |          S )z
        Create a QUIC stream and return a pair of (reader, writer) objects.

        The returned reader and writer objects are instances of
        :class:`asyncio.StreamReader` and :class:`asyncio.StreamWriter` classes.
        )rE   )r(   get_next_available_stream_id_create_stream)r5   rE   	stream_ids      r   create_streamz$QuicConnectionProtocol.create_streamD   s=       J;;/ < 
 
	 ""9---r   c                `    | j                                          |                                  dS )z;
        Request an update of the encryption keys.
        N)r(   request_key_updater<   r=   s    r   rN   z)QuicConnectionProtocol.request_key_updateR   s)     	
%%'''r   c                   K   | j                                         }t          |          }|| j        |<   | j                            |           |                                  t          j        |           d{V  dS )z:
        Ping the peer and wait for the response.
        N)	r$   create_futureidr'   r(   	send_pingr<   r   shield)r5   waiteruids      r   pingzQuicConnectionProtocol.pingY   s~       ))++jj"(3
S!!!nV$$$$$$$$$$$r   c                `   d| _         |                                 }| j        }|Kg }d}| j                            |          D ]\  }}|                    |           |}|r |||           n>| j        }| j                            |          D ]\  }}|                    ||           | j                                        }| j	        +| j
        |k    r | j	                                         d| _	        | j	        '|%| j                            || j                  | _	        || _
        dS )zQ
        Send pending datagrams to the peer and arm the timer if needed.
        NrB   )r.   r&   r0   r(   datagrams_to_sendappendr/   sendto	get_timerr,   r-   cancelr$   call_at_handle_timer)	r5   rC   sendto_many	datagrams	send_addrdatar@   	transporttimer_ats	            r   r<   zQuicConnectionProtocol.transmitd   sO    #oo '"%'I/3I"j::s:CC ! !
d  &&& 		 2Iy111I"j::s:CC - -
d  t,,,, :''));"t~'A'AK   DK;8#7*,,Xt7IJJDK!r   c                H   K   | j                                          d{V  dS )z7
        Wait for the connection to be closed.
        N)r!   waitr=   s    r   wait_closedz"QuicConnectionProtocol.wait_closed   s4       l!!!!!!!!!!!r   c                   K   | j         
J d            | j        s?| j                                        | _         t	          j        | j                    d{V  dS dS )z9
        Wait for the TLS handshake to complete.
        Nzalready awaiting connected)r#   r"   r$   rP   r   rS   r=   s    r   wait_connectedz%QuicConnectionProtocol.wait_connected   su       %--/K--- 	9%)Z%=%=%?%?D".!788888888888	9 	9r   rc   asyncio.BaseTransportc                p    t          t          j        |          | _        t	          |dd           | _        d S )Nr_   )r   r   DatagramTransportr/   getattrr0   )r5   rc   s     r   connection_madez&QuicConnectionProtocol.connection_made   s0    w8)DD#I}dCCr   rb   bytes | strc                    | j                             t          t          |          ||                                            |                                  |                                  d S NrB   )r(   receive_datagramr   bytesr&   _process_eventsr<   )r5   rb   r@   s      r   datagram_receivedz(QuicConnectionProtocol.datagram_received   sV    
##D$5$5tARAR#SSSr   list[bytes]c                    |                                  }| j        j        }|D ]} ||||           |                                  |                                  d S rq   )r&   r(   rr   rt   r<   )r5   rb   r@   rC   receivedgrams         r   datagrams_receivedz)QuicConnectionProtocol.datagrams_received   sg    oo*- 	* 	*EGE4S)))))r   eventevents.QuicEventc           	        t          |t          j                  r2| j                                        D ]}|                                 dS t          |t          j                  r| j                            |j        d          }|C|j        | j	        v rdS | 
                    |j                  \  }}|                     ||           |                    |j                   |j        r|                                 dS dS t          |t          j                  r| j                            |j        d          }|t|                    t#          d|j         d|j         d                     | j                            |j        d           | j	                            |j                   dS dS t          |t          j                  rw| j                            |j        d          }|W|                                 | j                            |j        d           | j	                            |j                   dS dS dS )zx
        Called when a QUIC event is received.

        Reimplement this in your subclass to handle the events.
        NzStream z reset by peer (error code ))
isinstancer   ConnectionTerminatedr)   valuesfeed_eofStreamDataReceivedgetrK   r+   rJ   r4   	feed_datarb   
end_streamStreamResetset_exceptionConnectionResetError
error_codepopaddStopSendingReceived)r5   r{   readerwriters       r   quic_event_receivedz*QuicConnectionProtocol.quic_event_received   sl    eV899 &	?.5577 " "!!!!" "v899 #	?)--eotDDF~?d&??? F!%!4!4U_!E!E$$VV444UZ((( "!!!!!" "v122 	?
 )--eotDDF!$$(;%/ ; ;','7; ; ;    $(($???)--eo>>>>> "! v9:: 	? )--eotDDF!!!!$(($???)--eo>>>>>	? 	?
 "!r   rK   intc                    t          | |          }t          j                    }t          j        |d || j                  }|| j        |<   ||fS r   )QuicStreamAdapterr   StreamReaderStreamWriterr$   r)   )r5   rK   adapterr   r   s        r   rJ   z%QuicConnectionProtocol._create_stream   sP     $D)44%''%gtVTZHH*0Y'v~r   c                    t          | j        | j                                                  }d | _        d | _        | j                            |           |                                  |                                  d S rq   )	maxr-   r$   r%   r,   r(   handle_timerrt   r<   )r5   rC   s     r   r^   z$QuicConnectionProtocol._handle_timer   si    $.$*//"3"344
C(((r   c                6   | j         }| j        }|                                }|t          |t          j                  r|                     |j                   nt          |t          j                  r| 	                    |j                   nct          |t          j
                  r|                                  | j        (| j        }d | _        |                    t                     | j                                        D ]}|                    t                     | j                                         | j                                         nt          |t          j                  r2| j        *| j        }d| _        d | _        |                    d            nQt          |t          j                  r7| j                            |j        d           }||                    d             ||           |                                }|d S d S NT)r(   r   
next_eventr   r   ConnectionIdIssuedr1   connection_idConnectionIdRetiredr2   r   r3   r#   r   ConnectionErrorr'   r   clearr!   r*   HandshakeCompletedr"   
set_resultPingAcknowledgedr   rU   )r5   r   r   r{   rT   s        r   rt   z&QuicConnectionProtocol._process_events   s   z"6!!%!:;; ,2253FGGGGE6#=>> ,33E4GHHHHE6#>?? ,33555 )5!3F-1D*((999 #07799 : :F((9999"((***  """"E6#<== 	,)5!3F&*DO-1D*%%d+++E6#:;; ,+//	4@@%%%d+++&&&OO%%EA r   c                `    | j         &| j                            | j                  | _         d S d S r   )r.   r$   	call_soonr<   r=   s    r   _transmit_soonz%QuicConnectionProtocol._transmit_soon  s3    &"&*"6"6t}"E"ED '&r   r   )r   r
   r   r   r8   r9   )r@   r	   r8   r9   )F)rE   rF   r8   rG   )rc   rj   r8   r9   )rb   ro   r@   r	   r8   r9   )rb   rv   r@   r	   r8   r9   )r{   r|   r8   r9   )rK   r   r8   rG   )__name__
__module____qualname__r7   r;   r?   rD   rL   rN   rV   r<   rg   ri   rn   ru   rz   r   rJ   r^   rt   r   r   r   r   r   r      s       OS5 5 5 5 5:          ).. . . . .   	% 	% 	% 	%" " " "@" " " "9 9 9 9D D D D   
   -? -? -? -?b      $& $& $& $&LF F F F F Fr   r   c                  R     e Zd Zd fdZddZdddZddZddZddZddZ	 xZ
S )r   protocolr   rK   r   c                r    t                                                       || _        || _        d| _        d S )NF)superr7   r   rK   _closing)r5   r   rK   	__class__s      r   r7   zQuicStreamAdapter.__init__  s2     "r   r8   rF   c                    dS r   r   r=   s    r   can_write_eofzQuicStreamAdapter.can_write_eof  s    tr   Nnamestrdefaultr   c                     |dk    r| j         S dS )zC
        Get information about the underlying QUIC stream.
        rK   N)rK   )r5   r   r   s      r   get_extra_infoz QuicStreamAdapter.get_extra_info   s     ;>! r   r9   c                    | j         j                            | j        |           | j                                          d S r   )r   r(   send_stream_datarK   r   )r5   rb   s     r   writezQuicStreamAdapter.write'  s9    ,,T^TBBB$$&&&&&r   c                b   | j         rd S d| _         | j        j        j                            | j                  }|d S |j        }|j        s|j        rd S 	 | j        j        	                    | j        dd           n# t          t          f$ r Y d S w xY w| j                                         d S )NTr   )r   )r   r   r(   _streamsr   rK   senderis_finishedreset_pendingr   AssertionErrorKeyErrorr   )r5   streamr   s      r   	write_eofzQuicStreamAdapter.write_eof+  s    = 	F$-11$.AA>F 	!5 	F	M00QU0VVVV
 	 	 	 FF		
 	$$&&&&&s   'A> >BBc                .    |                                   d S r   )r   r=   s    r   r?   zQuicStreamAdapter.close>  s    r   c                    | j         S r   )r   r=   s    r   
is_closingzQuicStreamAdapter.is_closingA  s
    }r   )r   r   rK   r   )r8   rF   r   )r   r   r   r   r8   r   r   )r   r   r   r7   r   r   r   r   r?   r   __classcell__)r   s   @r   r   r     s                " " " " "' ' ' '' ' ' '&          r   r   )
__future__r   r   typingr   r   r   r   r   quic.connectionr	   r
   rs   QuicConnectionIdHandlerr   r   QuicStreamHandlerDatagramProtocolr   	Transportr   r   r   r   <module>r      s	   " " " " " "  & & & & & & & & & &       < < < < < < < <"E7D=1 g2G4HI4OP EF EF EF EF EFW5 EF EF EFP- - - - -) - - - - -r   