
    mbi"                        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d.dZd/d Zd0d#Zd)d$Zd)d%Zd)d&ZdS )1QuicConnectionProtocolNquicr
   stream_handlerQuicStreamHandler | Nonec                >   t          j                    }t          j                    | _        d| _        d | _        || _        i | _        || _        i | _	        d | _
        d | _        d | _        d | _        d | _        d | _        d | _        |	|| _        d S d | _        d S )NFc                    d S N cs    d/var/www/html/mdtn/previsions/meteo_cartes/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_ping_waiters_quic_stream_readers_timer	_timer_at_transmit_task
_transport_connection_id_issued_handler_connection_id_retired_handler_connection_terminated_handler_stream_handler)selfr   r   loops       r   __init__zQuicConnectionProtocol.__init__   s     '))}>B
>@
@B26'+59<@ 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r0   s    r   r6   z+QuicConnectionProtocol.change_connection_id(   s)     	
'')))r   c                `    | j                                          |                                  dS )z'
        Close the connection.
        N)r&   closer7   r8   s    r   r:   zQuicConnectionProtocol.close1   s)     	
r   addrr	   c                    | j                             || j                                                   |                                  dS )zt
        Initiate the TLS handshake.

        This method can only be called for clients and a single time.
        nowN)r&   connectr$   timer7   )r0   r;   s     r   r?   zQuicConnectionProtocol.connect8   s<     	
4TZ__%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.
        )rA   )r&   get_next_available_stream_id_create_stream)r0   rA   	stream_ids      r   create_streamz$QuicConnectionProtocol.create_streamA   s=       J;;/ < 
 
	 ""9---r   c                `    | j                                          |                                  dS )z;
        Request an update of the encryption keys.
        N)r&   request_key_updater7   r8   s    r   rJ   z)QuicConnectionProtocol.request_key_updateO   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_pingr7   r   shield)r0   waiteruids      r   pingzQuicConnectionProtocol.pingV   s~       ))++jj"(3
S!!!nV$$$$$$$$$$$r   c                   d| _         | j                            | j                                                  D ] \  }}| j                            ||           !| 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.
        Nr=   )r*   r&   datagrams_to_sendr$   r@   r+   sendto	get_timerr(   r)   cancelcall_at_handle_timer)r0   datar;   timer_ats       r   r7   zQuicConnectionProtocol.transmita   s     # *664:??;L;L6MM 	/ 	/JD$O""4.... :''));"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!   waitr8   s    r   wait_closedz"QuicConnectionProtocol.wait_closedt   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$   rL   r   rO   r8   s    r   wait_connectedz%QuicConnectionProtocol.wait_connectedz   su       %--/K--- 	9%)Z%=%=%?%?D".!788888888888	9 	9r   	transportasyncio.BaseTransportc                D    t          t          j        |          | _        d S r   )r   r   DatagramTransportr+   )r0   ra   s     r   connection_madez&QuicConnectionProtocol.connection_made   s    w8)DDr   rZ   bytes | strc                    | j                             t          t          |          || j                                                   |                                  |                                  d S Nr=   )r&   receive_datagramr   bytesr$   r@   _process_eventsr7   )r0   rZ   r;   s      r   datagram_receivedz(QuicConnectionProtocol.datagram_received   sX    
##D$5$5tARAR#SSSr   eventevents.QuicEventc                   t          |t          j                  r2| j                                        D ]}|                                 dS t          |t          j                  r| j                            |j        d          }|3| 	                    |j                  \  }}| 
                    ||           |                    |j                   |j        r|                                 dS dS dS )zx
        Called when a QUIC event is received.

        Reimplement this in your subclass to handle the events.
        N)
isinstancer   ConnectionTerminatedr'   valuesfeed_eofStreamDataReceivedgetrG   rF   r/   	feed_datarZ   
end_stream)r0   rm   readerwriters       r   quic_event_receivedz*QuicConnectionProtocol.quic_event_received   s    eV899 
	".5577 " "!!!!" "v899 	")--eotDDF~!%!4!4U_!E!E$$VV444UZ((( "!!!!!	" 	"" "r   rG   intc                    t          | |          }t          j                    }t          j        |d || j                  }|| j        |<   ||fS r   )QuicStreamAdapterr   StreamReaderStreamWriterr$   r'   )r0   rG   adapterrx   ry   s        r   rF   z%QuicConnectionProtocol._create_stream   sP     $D)44%''%gtVTZHH*0Y'v~r   c                    t          | j        | j                                                  }d | _        d | _        | j                            |           |                                  |                                  d S rh   )	maxr)   r$   r@   r(   r&   handle_timerrk   r7   )r0   r>   s     r   rY   z$QuicConnectionProtocol._handle_timer   si    $.$*//"3"344
C(((r   c                B   | 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            |                     |           | j                                         }| d S d S NT)r&   
next_eventrp   r   ConnectionIdIssuedr,   connection_idConnectionIdRetiredr-   rq   r.   r#   set_exceptionConnectionErrorr%   rr   clearr!   setHandshakeCompletedr"   
set_resultPingAcknowledgedpoprQ   rz   )r0   rm   rP   s      r   rk   z&QuicConnectionProtocol._process_events   s    
%%''%!:;; ,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+++$$U+++J))++E? r   c                `    | j         &| j                            | j                  | _         d S d S r   )r*   r$   	call_soonr7   r8   s    r   _transmit_soonz%QuicConnectionProtocol._transmit_soon   s3    &"&*"6"6t}"E"ED '&r   r   )r   r
   r   r   r3   r4   )r;   r	   r3   r4   )F)rA   rB   r3   rC   )ra   rb   r3   r4   )rZ   rf   r;   r	   r3   r4   )rm   rn   r3   r4   )rG   r{   r3   rC   )__name__
__module____qualname__r2   r6   r:   r?   rH   rJ   rR   r7   r^   r`   re   rl   rz   rF   rY   rk   r   r   r   r   r   r      s       OS5 5 5 5 54          ).. . . . .   	% 	% 	% 	%" " " "&" " " "9 9 9 9E E E E   " " " "*      !, !, !, !,F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   rG   r{   c                r    t                                                       || _        || _        d| _        d S )NF)superr2   r   rG   _closing)r0   r   rG   	__class__s      r   r2   zQuicStreamAdapter.__init__   s2     "r   r3   rB   c                    dS r   r   r8   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.
        rG   N)rG   )r0   r   r   s      r   get_extra_infoz QuicStreamAdapter.get_extra_info   s     ;>! r   r4   c                    | j         j                            | j        |           | j                                          d S r   )r   r&   send_stream_datarG   r   )r0   rZ   s     r   writezQuicStreamAdapter.write   s9    ,,T^TBBB$$&&&&&r   c                    | j         rd S d| _         | j        j                            | j        dd           | j                                         d S )NTr   )rw   )r   r   r&   r   rG   r   r8   s    r   	write_eofzQuicStreamAdapter.write_eof   sT    = 	F,,T^ST,RRR$$&&&&&r   c                .    |                                   d S r   )r   r8   s    r   r:   zQuicStreamAdapter.close   s    r   c                    | j         S r   )r   r8   s    r   
is_closingzQuicStreamAdapter.is_closing   s
    }r   )r   r   rG   r{   )r3   rB   r   )r   r   r   r   r3   r   r   )r   r   r   r2   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
   rj   QuicConnectionIdHandlerr~   r   QuicStreamHandlerDatagramProtocolr   	Transportr}   r   r   r   <module>r      s	   " " " " " "  & & & & & & & & & &       < < < < < < < <"E7D=1 g2G4HI4OP MF MF MF MF MFW5 MF MF MF`! ! ! ! !) ! ! ! ! !r   