
    osjq*                       d dl mZ d dlZd dlZd dlZd dlmZ d dlZd dl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mZ eeej0                  f   Zeeej0                  f   Zej6                  g ej8                  e   f   Zej6                  egej<                  d   f   Zej6                  eeegej<                  d   f   Z  G d de!      Z" G d de"      Z# G d de"      Z$ G d d      Z% G d de      Z&y)    )annotationsN)TracebackType)CloseReason   )RequestResponse)ASGITransport_ASGIApp)AsyncByteStream   )WebSocketDisconnectWebSocketUpgradeErrorNNNc                      e Zd Zy)ASGIWebSocketTransportErrorN)__name__
__module____qualname__     O/root/.hermes/venv/lib/python3.12/site-packages/httpx2/websockets/_transport.pyr   r      s    r   r   c                      e Zd ZddZy)UnhandledASGIMessageTypec                    || _         y N)messageselfr   s     r   __init__z!UnhandledASGIMessageType.__init__   s	    r   Nr   MessagereturnNoner   r   r   r   r   r   r   r   r      s    r   r   c                      e Zd ZddZy)UnhandledWebSocketEventc                    || _         y r   )event)r   r(   s     r   r   z UnhandledWebSocketEvent.__init__"   s	    
r   N)r(   zwsproto.events.Eventr"   r#   r$   r   r   r   r&   r&   !   s    r   r&   c                      e Zd Z	 d	 	 	 	 	 	 	 	 	 ddZ	 	 ddZ	 	 	 	 	 	 	 	 ddZdddZdddZddZddZ	ddd	Z
dd
ZddZy)ASGIWebSocketAsyncNetworkStreamc                B   || _         || _        t        j                  j                  j
                  t        j                  t           t        j                         | _
        t        j                  j                  j
                  t        j                  t           t        j                         | _        || _        || _        t        j                  t        j                   j"                        | _        | j$                  j'                  |d   |d          d| _        y )N)max_buffer_sizeheaderspathF)appscopeanyiostreamsstapledStapledObjectStreamcreate_memory_object_streamr!   mathinf_receive_queue_send_queue_task_group_initial_receive_timeoutwsprotoWSConnectionConnectionTypeSERVER
connectioninitiate_upgrade_connection	_aentered)r   r/   r0   
task_groupinitial_receive_timeouts        r   r   z(ASGIWebSocketAsyncNetworkStream.__init__'   s     
#mm33GG..w7Q
 !==00DD..w7Q
 &(?%!..w/E/E/L/LM33E)4DeFmTr   c           
     F  K   | j                   rt        d      d| _         | j                  j                  | j                         t        j                         4 d {   }|j                  | j                         | j                  ddi       d {    	 | j                  | j                         d {   }|d   dk(  r6|j                          d {    t        |d   |j                  d            |d   d	k(  r|d
   }|d   }g }	 | j                          d {   }|d   dk(  sJ |j                  |d          |j                  dd      snJ|j                          d {    t!        t#        ||dj%                  |                  |d   dk(  sJ | | j'                  |      f}|j)                         | _        d d d       d {    |S 7 ~7 K7 *# t        $ r}t        d      |d }~ww xY w7 *7 7 7 3# 1 d {  7  sw Y   S xY ww)NzECannot use ASGIWebSocketAsyncNetworkStream in a context manager twiceTtypezwebsocket.connectzPWebSocket didn't accept the connection in time. Did you forget to call accept()?websocket.closecodereasonzwebsocket.http.response.startstatusr-   zwebsocket.http.response.bodybody	more_bodyFr   )r-   contentzwebsocket.accept)rB   RuntimeErrorr:   
start_soon_run
contextlibAsyncExitStackpush_async_callbackaclosesendreceiver;   TimeoutErrorr   getappendr   r   join_build_accept_responsepop_all_exit_stack)r   stackr   estatus_coder-   rK   retvals           r   
__aenter__z*ASGIWebSocketAsyncNetworkStream.__aenter__<   s      >>fgg##DII.,,. !	/ !	/%%%dkk2))V%89::: $T-J-J KK v"33lln$$)'&/7;;x;PQQ v"AA#*8#45<Y5G$&$(LLN2G"6?.LLLLKK0";;{E:  lln$$+H['[^[c[cdh[i,jkk6?&8888466w??F$}}DC!	/ !	/D E!	/: L "f % 3 %9!	/ !	/ !	/ !	/D s   AH!GH!"2HGHG%8G"9G%=HHA
H#H$A	H-H.AH
H!H	H!H"G%%	G?.G::G??HHH	H!HHHH!c                X   K   | j                   j                  |||       d {   S 7 wr   )r]   	__aexit__)r   exc_typeexc_valexc_tbs       r   rd   z)ASGIWebSocketAsyncNetworkStream.__aexit__g   s)      %%//'6JJJJs   !*(*Nc                  K   | j                  |       d {   }|d   }|dvrt        |      |dk(  re|j                  d      }|t        j                  j                  |      }|j                  d      }|Kt        j                  j                  |      }n+|dk(  r&t        j                  j                  |d   |d	         }| j                  j                        S 7 ȭw)
N)timeoutrF   >   websocket.sendrG   rj   textbytesrG   rH   rI   )
rV   r   rX   r<   eventsTextMessageBytesMessageCloseConnectionr@   rU   )r   	max_bytesri   r   rF   data_strr(   
data_bytess           r   readz$ASGIWebSocketAsyncNetworkStream.reado   s     !%g!>>v<<*733 ###*;;v#6H#228<'.{{7';J%33J?&&NN2276?GHDUVE##E**# ?s   C#C!C	C#c                  K   | j                   j                  |       | j                   j                         D ]  }t        |t        j                  j
                        r)t        |t        j                  j                        r2| j                  d|j                  |j                  d       d {    t        |t        j                  j                        r'| j                  d|j                  d       d {    t        |t        j                  j                        r(| j                  d|j                  d       d {    t        |       y 7 7 `7 w)Nwebsocket.disconnectrF   rH   rI   zwebsocket.receive)rF   rk   )rF   rl   )r@   receive_datarm   
isinstancer<   r   rp   rU   rH   rI   rn   dataro   r&   )r   bufferri   r(   s       r   writez%ASGIWebSocketAsyncNetworkStream.write   s    $$V,__++- 	5E%!7!78E7>>#A#ABii 6 %

"',,   E7>>#=#=>ii)<ejj QRRRE7>>#>#>?ii)<uzz RSSS-e44!	5 SSs8   B/E!1E2A
E!<E=A
E!EE!E!E!c                F  K   t        j                  t        j                        5  | j	                  ddi       d {    d d d        | j
                  j                          d {    | j                  j                          d {    y 7 Q# 1 sw Y   PxY w7 57 w)NrF   rv   )rQ   suppressr1   ClosedResourceErrorrU   r8   rT   r9   )r   s    r   rT   z&ASGIWebSocketAsyncNetworkStream.aclose   s       !:!:; 	>))V%;<===	>!!((***%%''' >	> 	>*'sJ   $B!BBB%B!'B(!B!	B
B!BBB!B!c                V   K   | j                   j                  |       d {    y 7 wr   )r8   rU   r   s     r   rU   z$ASGIWebSocketAsyncNetworkStream.send   s      !!&&w///s   )')c                   K   |t         j                  }t        j                  |      5  | j                  j                          d {   cd d d        S 7 # 1 sw Y   y xY wwr   )r6   r7   r1   
fail_afterr9   rV   )r   ri   s     r   rV   z'ASGIWebSocketAsyncNetworkStream.receive   sT     ?hhGg& 	4))1133	4 	43	4 	4s.   (A$AA	A
A$AA!A$c                  K   | j                   }| j                  j                  }| j                  j                  }	 | j                  |||       d{    y7 # t        $ rv}dt        j                  t        |      d}t        j                  t        j                        5   ||       d{  7   ddd       n# 1 sw Y   nxY wY d}~yY d}~yd}~ww xY ww)zE
        The sub-thread in which the websocket session runs.
        NrG   rw   )r0   r8   rV   r9   rU   r/   	Exceptionr   INTERNAL_ERRORstrrQ   r~   r1   r   )r   r0   rV   rU   r_   r   s         r   rP   z$ASGIWebSocketAsyncNetworkStream._run   s      

%%--$$		$((5'4000 	$)#22a&G
 $$U%>%>? $7m##$ $ $ $ $	$se   9CA AA CA 	C#A C#B>/B20B>5	C>C	C

CCCc                    |j                  dd       }|j                  dg       }| j                  j                  t        j                  j                  ||            S )Nsubprotocolr-   )r   extra_headers)rX   r@   rU   r<   rm   AcceptConnection)r   r   r   r-   s       r   r[   z6ASGIWebSocketAsyncNetworkStream._build_accept_response   sV    kk-6++i,##NN++'% , 
 	
r   )      ?)
r/   ASGIAppr0   ScoperC   zanyio.abc.TaskGrouprD   floatr"   r#   )r"   z-tuple[ASGIWebSocketAsyncNetworkStream, bytes])re   type[BaseException] | Nonerf   BaseException | Nonerg   TracebackType | Noner"   zbool | Noner   )rq   intri   float | Noner"   rl   )r{   rl   ri   r   r"   r#   )r"   r#   r    )ri   r   r"   r!   )r   r!   r"   rl   )r   r   r   r   rb   rd   rt   r|   rT   rU   rV   rP   r[   r   r   r   r*   r*   &   s     *-  (	
 "' 
*)	6)VK,K &K %	K
 
K+(5((04$$
r   r*   c                       e Zd Z	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 d fdZd	dZ	 	 	 d
	 	 	 	 	 	 	 d fdZd fdZ	 	 	 	 ddZ	 	 	 	 	 	 ddZ xZ	S )ASGIWebSocketTransportc                F    t         |   ||||       d | _        || _        y r   )superr   r]   r;   )r   r/   raise_app_exceptions	root_pathclientrD   	__class__s         r   r   zASGIWebSocketTransport.__init__   s)     	2IvF=A(?%r   c                *  K   t        j                         4 d {   }|j                  t        j                                d {   | _        |j                         | _        d d d       d {    | S 7 [7 27 
# 1 d {  7  sw Y   | S xY wwr   )rQ   rR   enter_async_contextr1   create_task_groupr:   r\   r]   )r   r^   s     r   rb   z!ASGIWebSocketTransport.__aenter__   s     ,,. 	/ 	/%%*%>%>u?V?V?X%YYD$}}D	/ 	/ 		/Y	/ 	/ 	/ 	/ sV   BA7B'A=A9A=%B0A;1B9A=;B=BBBBc                   K   t         |   |||       d {    | j                  J | j                  j                  |||       d {    y 7 87 wr   )r   rd   r]   )r   re   rf   rg   r   s       r   rd   z ASGIWebSocketTransport.__aexit__   sY      g'6:::+++((7FCCC 	;Cs!   AA2AAAAc                  K   |j                   j                  }|j                  }|dv s|j                  d      dk(  rg }|j                  d      x}|j	                  d      }d|j                   j
                  |j                   j                  | j                  ||j                   j                  |j                  j                  D cg c]  \  }}|j                         |f c}}| j                  |j                   j                  |j                   j                  f|d
}| j                  ||       d {   S t        	| A  |       d {   S c c}}w 7 !7 w)N>   wswssupgrade	websocketzsec-websocket-protocol,)
rF   r.   raw_pathr   schemequery_stringr-   r   serversubprotocols)urlr   r-   rX   splitr.   r   r   queryrawlowerr   hostport_handle_ws_requestr   handle_async_request)
r   requestr   r-   r   subprotocols_headerkvr0   r   s
            r   r   z+ASGIWebSocketTransport.handle_async_request   s&    ##//]"gkk)&<&K&(L'.{{3K'LL#Y288= $((#KK00!^^  ' 1 19@9L9LMv1QWWYNM++";;++W[[-=-=> ,E 00%@@@W1'::: N
 A:s1   CE	E%AE7E8EEEEc                  K   t        | j                  | j                  | j                  | j                        }| j
                  J | j
                  j                  |       d {   }|j                  |       y 7 wr   )r*   r/   r0   r:   r;   r]   r   started)r   task_statusstreamresults       r   +_create_asgi_websocket_async_network_streamzBASGIWebSocketTransport._create_asgi_websocket_async_network_stream   ss     
 1HHJJ))	
 +++'';;FCCF# Ds   A#A>%A<&A>c           
       K   t        |j                  t              sJ || _        | j                  j                  | j                         d {   \  }}|j                  d      j                         }|dd  D cg c]L  }|j                         dk7  r7t        j                  t        t        t        f   |j                  dd            N }}t        d|d|i      S 7 c c}w w)Nzutf-8r    z: e   network_stream)r`   r-   
extensions)ry   r   r   r0   r:   startr   decode
splitlinesstriptypingcasttupler   r   r   )r   r   r0   r   accept_responseaccept_response_linesliner-   s           r   r   z)ASGIWebSocketTransport._handle_ws_request	  s     
 '../:::
(,(8(8(>(>t?o?o(p"p / 6 6w ? J J L .ab1
zz|r! KKc3hD!)<=
 
 (&1
 	
 #q
s%   AC&C-C&<AC!C&!C&)Tr   )z	127.0.0.1{   r   )r/   r
   r   boolr   r   r   ztuple[str, int]rD   r   r"   r#   )r"   r   r   )re   r   rf   r   rg   r   r"   r#   )r   r   r"   r   )r   zCanyio.abc.TaskStatus[tuple[ASGIWebSocketAsyncNetworkStream, bytes]]r"   r#   )r   r   r0   r   r"   r   )
r   r   r   r   rb   rd   r   r   r   __classcell__)r   s   @r   r   r      s     &*"4),
@
@ #
@ 	
@
  
@ "'
@ 

@ 04(,'+	D,D &D %	D
 
D;2$ Y$ 
	$

 
 
	
r   r   )'
__future__r   rQ   r6   r   typesr   r1   r<   wsproto.frame_protocolr   _modelsr   r   _transports.asgir	   r
   _typesr   _exceptionsr   r   dictr   Anyr   r!   Callable	AwaitableReceive	CoroutineSendr   r   r   r   r&   r*   r   r   r   r   <module>r      s    "       . ' 6 $ CS&**_
sFJJ

//"f..w77
8w 0 01A BBC
//5'40&2B2BCS2TT
U	) 	: 
9 
Z
 Z
zZ
] Z
r   