U
    <{f                     @   s   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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mZmZ G dd deZG dd deZG dd	 d	eZdS )
    N)NullContext)QUIC_MAX_DATAGRAMAsyncQuicConnectionAsyncQuicManagerBaseQuicStreamUnexpectedEOFc                       sX   e Zd Z fddZdd ZdddZdd	d
Zdd Zdd Zdd Z	dd Z
  ZS )TrioQuicStreamc                    s   t  || t | _d S N)super__init__trio	Condition_wake_up)self
connection	stream_id	__class__ M/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/dns/quic/_trio.pyr      s    zTrioQuicStream.__init__c              
      sR   | j |rd S || _| j4 I d H  | j I d H  W 5 Q I d H R X d| _q d S )Nr   )_bufferZhaveZ
_expectingr   wait)r   amountr   r   r   wait_for   s     zTrioQuicStream.wait_forNc              
      s   |d krt d }n
t|}|P | dI d H  td| jd\}| |I d H  | j|W  5 Q R  S Q R X tj	j
d S )N   z!H)r   r   move_on_afterr   structunpackr   getdns	exceptionTimeout)r   timeoutcontextsizer   r   r   receive'   s    

zTrioQuicStream.receiveFc                    s&   |  |}| j| j||I d H  d S r	   )Z_encapsulate_connectionwriteZ
_stream_id)r   datagramis_enddatar   r   r   send3   s    
zTrioQuicStream.sendc              
      s:   |  ||r6| j4 I d H  | j  W 5 Q I d H R X d S r	   )Z_common_add_inputr   notify)r   r*   r)   r   r   r   
_add_input7   s    zTrioQuicStream._add_inputc                    s   |    d S r	   )_closer   r   r   r   close<   s    zTrioQuicStream.closec                    s   | S r	   r   r/   r   r   r   
__aenter__A   s    zTrioQuicStream.__aenter__c              
      s<   |   I d H  | j4 I d H  | j  W 5 Q I d H R X dS NF)r0   r   r,   )r   exc_typeexc_valexc_tbr   r   r   	__aexit__D   s    zTrioQuicStream.__aexit__)N)F)__name__
__module____qualname__r   r   r%   r+   r-   r0   r1   r6   __classcell__r   r   r   r   r      s   	

r   c                       sR   e Zd Zd fdd	Zdd Zdd Zdd	d
Zdd ZdddZdd Z	  Z
S )TrioQuicConnectionNc                    sP   t  |||||| tj| jtjd| _t | _t | _	d | _
d| _d S )Nr   F)r
   r   r   socket_af
SOCK_DGRAM_socketEvent_handshake_complete	_run_done_worker_scope_send_pending)r   r   addressportsourcesource_portmanagerr   r   r   r   L   s    

zTrioQuicConnection.__init__c              	      s  z| jr(| jtj| j| j	I d H  | j
| jI d H  | j s| d\}}| jrZd}tjt | d0| _| jtI d H }| j|| jt  W 5 Q R X d | _| | |  I d H  d| _| jt }|D ]\}}| j|I d H  qq<W 5 d| _ | j  X d S )NTFg        )deadline)_donerA   set_sourcer?   bindr   ZinetZlow_level_address_tupler=   connect_peerZ_get_timer_valuesrD   r   ZCancelScopecurrent_timerC   recvr   r&   Zreceive_datagramtimeZ_handle_timer_handle_eventsZdatagrams_to_sendr+   )r   Z
expirationintervalr(   Z	datagrams_r   r   r   _workerT   s2    

 
zTrioQuicConnection._workerc                    s   d}| j  }|d krd S t|tjjjrT| j|j	}|r|
|j|jI d H  nrt|tjjjrp| j  nVt|tjjjrd| _| j  n4t|tjjjr| j|j	}|r|
ddI d H  |d7 }|dkrd}tdI d H  qd S )Nr   T       
   )r&   Z
next_event
isinstanceaioquicZquiceventsZStreamDataReceived_streamsr   r   r-   r*   Z
end_streamZHandshakeCompletedrA   rL   ZConnectionTerminatedrK   r?   r0   ZStreamResetr   sleep)r   counteventstreamr   r   r   rT   x   s*    
z!TrioQuicConnection._handle_eventsFc                    s.   | j ||| d| _| jd k	r*| j  d S )NT)r&   Zsend_stream_datarD   rC   cancel)r   rb   r*   r)   r   r   r   r'      s    
zTrioQuicConnection.writec              
      sF   | j r
d S t 4 I d H }|| j W 5 Q I d H R X | j  d S r	   )_closedr   Zopen_nursery
start_soonrW   rB   rL   )r   nurseryr   r   r   run   s
    zTrioQuicConnection.runc              
      s~   |d krt d }n
t|}|L | j I d H  | jr<t| jd}t	| |}|| j
|< |W  5 Q R  S Q R X tjjd S r2   )r   r   r   rA   r   rK   r   r&   Zget_next_available_stream_idr   r^   r   r    r!   )r   r"   r#   r   rb   r   r   r   make_stream   s    



zTrioQuicConnection.make_streamc                    s^   | j sZ| j| jd | jd  d| _ | j  d| _| jd k	rJ| j  | j	
 I d H  d S )Nr   rY   T)rd   _managerclosedrP   r&   r0   rD   rC   rc   rB   r   r/   r   r   r   r0      s    


zTrioQuicConnection.close)N)F)N)r7   r8   r9   r   rW   rT   r'   rg   rh   r0   r:   r   r   r   r   r;   K   s   $

r;   c                       s@   e Zd Zdejdf fdd	ZdddZd	d
 Zdd Z  Z	S )TrioQuicManagerNc                    s   t  ||t| || _d S r	   )r
   r   r;   _nursery)r   rf   confverify_modeZserver_namer   r   r   r      s    zTrioQuicManager.__init__U  r   Tc                 C   s,   |  |||||\}}|r(| j|j |S r	   )_connectrl   re   rg   )r   rE   rF   rG   rH   Zwant_session_ticketr   startr   r   r   rO      s        zTrioQuicManager.connectc                    s   | S r	   r   r/   r   r   r   r1      s    zTrioQuicManager.__aenter__c                    s*   t | j }|D ]}| I d H  qdS r2   )listZ_connectionsvaluesr0   )r   r3   r4   r5   connectionsr   r   r   r   r6      s    zTrioQuicManager.__aexit__)ro   Nr   T)
r7   r8   r9   sslCERT_REQUIREDr   rO   r1   r6   r:   r   r   r   r   rk      s            

rk   )r<   ru   r   rS   Zaioquic.quic.configurationr\   Zaioquic.quic.connectionZaioquic.quic.eventsr   Zdns.exceptionr   Zdns.inetZdns._asyncbackendr   Zdns.quic._commonr   r   r   r   r   r   r;   rk   r   r   r   r   <module>   s   	2m