U
    ){f                     @  s  d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
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mZmZmZ d d
lmZmZmZ ddlmZ ddl m!Z! ddl"m#Z#m$Z$m%Z% ddlm&Z&m'Z'm(Z(m)Z)m*Z* eG dd dZ+G dd dZ,dS )    )annotations)	dataclass)partial)	AwaitableCallableDictOptionalSetTuple)Buffer)H3_ALPN)QuicConfiguration)QuicConnection)ConnectionIdIssuedConnectionIdRetiredConnectionTerminatedProtocolNegotiated)encode_quic_version_negotiationPACKET_TYPE_INITIALpull_quic_header   )
H3Protocol   )Config)ClosedEventRawData)
AppWrapperConnectionState
SingleTask	TaskGroupWorkerContextc                   @  s2   e Zd ZU ded< ded< ded< dZded	< dS )
_Connectionz
Set[bytes]cidsr   quicr   taskNzOptional[H3Protocol]h3)__name__
__module____qualname____annotations__r&    r+   r+   V/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/hypercorn/protocol/quic.pyr"      s   
r"   c                	   @  s   e Zd Zddddddddd	d
dZeddddZdddddZdddddZd ddddddZddddddZ	dS )!QuicProtocolr   r   r!   r    r   zOptional[Tuple[str, int]]z"Callable[[Event], Awaitable[None]]None)appconfigcontext
task_groupstateserversendreturnc                 C  sV   || _ || _|| _i | _|| _|| _|| _|| _tt	dd| _
| j
j|j|jd d S )NF)alpn_protocolsZ	is_client)certfilekeyfile)r/   r0   r1   connectionsr5   r4   r2   r3   r   r   quic_configload_cert_chainr8   r9   )selfr/   r0   r1   r2   r3   r4   r5   r+   r+   r,   __init__&   s    
zQuicProtocol.__init__bool)r6   c                 C  s   t | jdkS )Nr   )lenr:   )r=   r+   r+   r,   idle<   s    zQuicProtocol.idler   )eventr6   c                   sZ  t |trJztt|jddd}W n tk
r:   Y d S X |jd k	r|j| jjkrt	|j
|j| jjd}| t||jdI d H  d S | j|j
}|d krt|jdkr|jtkr| jj st| j|j
d}t|j
|jh|| j d}|| j|j
< || j|j< |d k	rV|jj|j|j| j d	 | ||jI d H  nt |trVd S )
N)data   )Zhost_cid_length)
source_ciddestination_cidsupported_versionsrC   addressi  )configurationZ"original_destination_connection_id)r#   r$   r%   now)
isinstancer   r   r   rC   
ValueErrorversionr;   rG   r   rF   rE   r5   rI   r:   getr@   Zpacket_typer   r1   Z
terminatedis_setr   r"   Zhost_cidZsingle_task_classr$   Zreceive_datagramtime_handle_eventsr   )r=   rB   headerrC   
connectionZquic_connectionr+   r+   r,   handle@   sR    


zQuicProtocol.handler"   )rU   r6   c                   sl   |j j| j dD ] \}}| t||dI d H  q|j  }|d k	rh|j| j	t
| j||I d H  d S )NrK   rH   )r$   Zdatagrams_to_sendr1   rR   r5   r   Z	get_timerr%   Zrestartr2   r   _handle_timer)r=   rU   rC   rI   timerr+   r+   r,   send_allk   s    
 zQuicProtocol.send_allN)rU   clientr6   c                   s
  |j  }|d k	rt|trJ|j I d H  |jD ]}| j|= q2t |_nt|t	rt
| j| j| j| j| j|| j|j t| j|	|_nHt|tr|j|j || j|j< n"t|tr|j|j | j|j= |jd k	r|j|I d H  |j  }q
| |I d H  d S )N)r$   Z
next_eventrM   r   r%   stopr#   r:   setr   r   r/   r0   r1   r2   r3   r4   r   rY   r&   r   addZconnection_idr   removerV   )r=   rU   rZ   rB   Zcidr+   r+   r,   rS   u   s:    










zQuicProtocol._handle_eventsfloat)rX   rU   r6   c                   sP   t d|| j  }| j|I d H  |jj| j d | |d I d H  d S )Nr   rK   )maxr1   rR   sleepr$   Zhandle_timerrS   )r=   rX   rU   waitr+   r+   r,   rW      s    zQuicProtocol._handle_timer)N)
r'   r(   r)   r>   propertyrA   rV   rY   rS   rW   r+   r+   r+   r,   r-   %   s   + $r-   N)-
__future__r   dataclassesr   	functoolsr   typingr   r   r   r   r	   r
   Zaioquic.bufferr   Zaioquic.h3.connectionr   Zaioquic.quic.configurationr   Zaioquic.quic.connectionr   Zaioquic.quic.eventsr   r   r   r   Zaioquic.quic.packetr   r   r   r&   r   r0   r   eventsr   r   r   r   r   r   r    r!   r"   r-   r+   r+   r+   r,   <module>   s     