
    )jA                     "   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 d dlmZ d dlmZ dZdZdZd	Zd
Z eej                            dd                    Z ej        e          Z G d d          Z G d d          ZdS )    N)schedule_coroutine)	UnChunkergenerate_chunks)PublishManager)ServerProtocolii iiiWSLINK_MAX_MSG_SIZE4194304c                   &   e Zd Zd Zed             Zed             Zed             Zed             Zed             Z	ed             Z
ed             Zej        d	             Zd
 Zd Zed             Zd Zd Zed             Zd ZddZd ZdS )AbstractWebAppc                    d | _         || _        d | _        	 t          j                    }n7# t
          $ r* t          j                    }t          j        |           Y nw xY w|                                | _	        d | _
        d S N)_last_active_client_id_config_shutdown_taskasyncioget_event_loopRuntimeErrornew_event_loopset_event_loopcreate_future_completion_app)selfserver_configloops      I/DATA/AppData/hermes/venv/lib/python3.11/site-packages/wslink/protocol.py__init__zAbstractWebApp.__init__   s    &*#$"	))++DD 	) 	) 	))++D"4(((((	)  --//			s   + 1AAc                     | j         S r   )r   r   s    r   configzAbstractWebApp.config.   s
    |    c                 R    t          | j                            dd                    S )Ntimeout0intr    getr   s    r   r#   zAbstractWebApp.timeout2   s     4;??9c22333r!   c                 8    | j                             dd          S )Nhostz	127.0.0.1r    r'   r   s    r   r)   zAbstractWebApp.host6   s    {v{333r!   c                 R    t          | j                            dd                    S )Nport8080r%   r   s    r   r,   zAbstractWebApp.port:   s     4;??6622333r!   c                 8    | j                             dd          S )Nhandle_signalsTr*   r   s    r   r/   zAbstractWebApp.handle_signals>   s    {/666r!   c                 8    | j                             dd           S )Nsslr*   r   s    r   ssl_contextzAbstractWebApp.ssl_contextB   s    {ud+++r!   c                     | j         S r   r   r   s    r   last_active_client_idz$AbstractWebApp.last_active_client_idJ   s    **r!   c                     || _         d S r   r4   )r   values     r   r5   z$AbstractWebApp.last_active_client_idN   s    &+###r!   c                     || _         d S r   r   )r   apps     r   set_appzAbstractWebApp.set_appV   s    			r!   c                     | j         S r   r9   r   s    r   get_appzAbstractWebApp.get_appY   s
    yr!   c                     | j         S r   r9   r   s    r   r:   zAbstractWebApp.app\   s
    yr!   c                 ^    | j         dk    rt          | j         | j                  nd | _        d S Nr   )r#   r   stopr   r   s    r   shutdown_schedulez AbstractWebApp.shutdown_scheduled   s4    ;?<!;K;Kt|TY777QU 	r!   c                     | j         <t                              d           | j                                          d | _         d S d S )NzCanceling shutdown task)r   loggerinfocancelr   s    r   shutdown_cancelzAbstractWebApp.shutdown_canceli   sI    *KK1222&&((("&D +*r!   c                     | j         S r   )r   r   s    r   
completionzAbstractWebApp.completions       r!   c                     dS r@    r   s    r   get_portzAbstractWebApp.get_portw   s    qr!   Nc                 
   K   d S r   rL   )r   port_callbacks     r   startzAbstractWebApp.start~         r!   c                 
   K   d S r   rL   r   s    r   rA   zAbstractWebApp.stop   rQ   r!   r   )__name__
__module____qualname__r   propertyr    r#   r)   r,   r/   r2   r5   setterr;   r=   r:   rB   rG   rI   rM   rP   rA   rL   r!   r   r   r      s       
 
 
    X 4 4 X4 4 4 X4 4 4 X4 7 7 X7 , , X, + + X+ !, , "!,       X
 
 

' ' '     X          r!   r   c                       e Zd ZddefdZd Zd Zed             Zed             Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd ZddZ	 ddZddZddZd Zd ZdS )WslinkHandlerNprotocolc                     | _         | _        i  _        i  _        g  _        i  _        t                       _        t          j	                     _
        t                       _        i  _        |j         _        |j         _                                         r                                                                 }|                                                                |D ]}|                     j         j         fd           d }t-          j        |j        |          D ]>}|d         }d|j        v r+|j        d         d         }d|v r|d         }	||f j        |	<   ? j                                        d S d S )Nc                  8    t          d j        j                  S r@   )r   web_apprA   r   s   r   <lambda>z(WslinkHandler.__init__.<locals>.<lambda>   s    .q$,2CDD r!   c                 R    t          j        |           pt          j        |           S r   )inspectismethod
isfunction)xs    r   testz$WslinkHandler.__init__.<locals>.test   s#    "+A..G'2DQ2G2GGr!      _wslinkurisr   uri)serverProtocolr]   functionMapattachmentsReceivedattachmentsRecvQueueconnectionssetauthentified_client_idsr   Lockattachment_atomicr   pub_manager
unchunkersnetwork_monitorlog_emittergetServerProtocolgetLinkProtocolsappendinitpublishaddAttachmentr`   
getmembers	__class____dict__registerProtocol)
r   rZ   r]   protocolListprotocolObjectrd   kprocuri_inforg   s
   `         r   r   zWslinkHandler.__init__   s   &#% $&!'*uu$!()++'7#/ !!## 	41133DDFFL 6 6 8 8999". K K##L&DDDD  H H H !+N,DdKK K KAQ4D$55#'=#?#B H,,"*5/C5CT4JD,S1K --d33333)	4 	4r!   c                     || _         d S r   rh   )r   rZ   s     r   setServerProtocolzWslinkHandler.setServerProtocol   s    &r!   c                     | j         S r   r   r   s    r   ru   zWslinkHandler.getServerProtocol   s    ""r!   c                     | j         S r   )rq   r   s    r   publishManagerzWslinkHandler.publishManager   rJ   r!   c                     dS )Nreverse_connection_client_idrL   r   s    r   r   z*WslinkHandler.reverse_connection_client_id   s    --r!   c                 ,  K   t                      | j        |<   | j        sd S t          | j        d          r| j                            ||           | j                                        D ](}t          |d          r|                    ||           )d S )N	onConnect)r   rr   rh   hasattrr   rv   )r   request	client_idlinkProtocols       r   r   zWslinkHandler.onConnect   s      %.[[	"" 	F4&44 	>))'9=== /@@BB 	; 	;L|[11 ;&&w	:::	; 	;r!   c                   K   | j         |= | j        sd S t          | j        d          r| j                            |           | j                                        D ]'}t          |d          r|                    |           (d S )NonClose)rr   rh   r   r   rv   )r   r   r   s      r   r   zWslinkHandler.onClose   s      OI&" 	F4&	22 	3''	222 /@@BB 	0 	0L|Y// 0$$Y///	0 	0r!   c                 h  K   |                     d          }|d         dk    r|dk    r|r|d         rt          |d                   t          u rd|d         v r|                     |d         d         |           d {V rd| j                            |           | j        |                             d           |                     |d| t          d|	           d {V  nI| 
                    |t          d
|	           d {V  n$| 
                    |t          d|	           d {V  dS dS )N:r   systemzwslink.hellosecretl        c)clientID
maxMsgSizer   zAuthentication failedzUnknown system method calledTF)splittypedictvalidateTokenrn   addrr   set_max_message_sizesendWrappedMessageMAX_MSG_SIZEsendWrappedErrorAUTHENTICATION_ERRORMETHOD_NOT_FOUND)r   rpcid
methodNameargsr   rpcLists         r   handleSystemMessagez!WslinkHandler.handleSystemMessage   s     ++c""1:!!^++Q d1g$..!T!W,,"00a1BINNNNNNNN - 044Y???OI.CC.   11(7I*6  #, 2           //,/"+	 0           ++$2'	 ,          4ur!   c                 `  K   |sDt                               d|j                   | j                            d|j                    d S | j        |                             |j                  }|>| j        5  |                     ||           d {V  d d d            d S # 1 swxY w Y   d S d S )Nz*wslink is not expecting text message:
> %sz(wslink is not expecting text message:
> )rD   criticaldatart   rr   process_chunkrs   onCompleteMessage)r   	is_binarymsgr   full_messages        r   	onMessagezWslinkHandler.onMessage   s'      	OOI38TTT%%FCHFF   Fy1??II#% F F,,\9EEEEEEEEEF F F F F F F F F F F F F F F F F F $#s   7B!!B%(B%c                    K   d}|                      |          }t                              ||           | j                            d          r| j                            ||z             d|vrd S |d         }|d         }g }i }d|v r#t          |d         t                    r|d         }d|v r#t          |d         t                    r|d         }|                     ||||           d {V rd S | 	                    |          sE| j
        5  |                     |t          d|           d {V  d d d            n# 1 swxY w Y   d S || j        vrc| j                            d	|            | j
        5  |                     |t          d
||           d {V  d d d            n# 1 swxY w Y   d S | j        |         \  }	}
|                    d|	           	 || j        _         |
|i |}t'          j        |          r'| j
        5  | d {V }d d d            n# 1 swxY w Y   | j        |         j        rd S | j
        5  |                     ||||           d {V  d d d            d S # 1 swxY w Y   d S # t0          $ r}t3          j                    }t                              d           t                              t7          |                     t                              |           | j                            |           | j
        5  |                     |t:          d|t7          |          |d|           d {V  d d d            n# 1 swxY w Y   Y d }~d S Y d }~d S d }~ww xY w)Nzwslink incoming msg %sdebugidmethodr   kwargsz%Unauthorized: Skip message processingr   zMethod not found: zUnregistered method calledr   )r   r   zException raised)r   	exceptiontrace)payloadWithSecretStrippedrD   r   rt   has
isinstancelistr   r   isClientAuthenticatedrs   r   r   ri   errorr   insertr]   r5   r`   isawaitablerl   closedr   	Exception	traceback
format_excreprr   EXCEPTION_ERROR)r   rpcr   debug_messagestripped_payloadr   r   r   r   objfuncresultse_instcaptured_traces                 r   r   zWslinkHandler.onCompleteMessage  s     099#>>]$4555(( 	E""=3C#CDDDs??F D	]
cMMz#f+t<<Mv;DOOCM4!@!@O]F ))%T9MMMMMMMM 	F )))44 	%  ++(;'	 ,                        F T---""#D
#D#DEEE%  ++$0' ,                        F$Z0	TAs 	1:DL.dD+F++G"7++ ,) , ,$+mmmmmmG, , , , , , , , , , , , , , , 	*1 %  --7: .                            	 	 	&133NLL+,,,LLf&&&LL(((&&v...%  ++#&",%)&\\!/ 
 ( , 
 
 
 
 
 
 
 
 
                          	s   %EEE;&F--F14F1!/J 	H%J %H))J ,H)-J J  I8+J 8I<<J ?I< J 
M=BM87M!M8!M%	%M8(M%	)M88M=c                     t          j        |          }d|v r*|d         D ]!}t          |          t          u r	d|v rd|d<   "|S )Nr   r   z*****)copydeepcopyr   r   )r   payloadargs      r   r   z'WslinkHandler.payloadWithSecretStripped]  sW    -((Wv , ,99$$S$+CMr!   c                 R  K   | j         sdS d}t          | j         d          r%d}| j                             ||           d {V sdS | j                                         D ]3}t          |d          r!d}|                    ||           d {V s dS 4|rdS || j         j        k    S )NTFr   )rh   r   r   rv   r   )r   tokenr   token_testedr   s        r   r   zWslinkHandler.validateTokene  s      " 	44&88 	L,::5)LLLLLLLL u /@@BB 	! 	!L|_55 !#)77yIIIIIIII ! 55 	4+222r!   c                     || j         v S r   )rn   )r   r   s     r   r   z#WslinkHandler.isClientAuthenticatedv  s    D888r!   Fc                      |r  j         j         fd j        D             S |r2                     |          r j                            |          gS g S  fd j        D             S )Nc                 `    g | ]*}                     |          r|k    j        |         +S rL   r   rl   ).0r   last_cr   s     r   
<listcomp>z<WslinkHandler.getAuthenticatedWebsockets.<locals>.<listcomp>|  sJ       --a00 67&[[  #5@[[r!   c                 T    g | ]$}                     |          j        |         %S rL   r   r   r   r   s     r   r   z<WslinkHandler.getAuthenticatedWebsockets.<locals>.<listcomp>  sE     
 
 
))!,,
Q
 
 
r!   )r]   r5   rl   r   r'   )r   r   skip_last_active_clientr   s   `  @r   getAuthenticatedWebsocketsz(WslinkHandler.getAuthenticatedWebsocketsy  s    " 	\7F    )     	)))44 9(,,Y7788I
 
 
 
%
 
 
 	
r!    c           	      `  K   d||d}	 t          j        |          }nU# t          $ rH | j        5  |                     |t
          d||           d {V  d d d            n# 1 swxY w Y   Y d S w xY w|                     ||          }| j        5  | j        4 d {V  t          |t                    D ]$}	|D ]}
|
|

                    |	           d {V   %	 d d d           d {V  n# 1 d {V swxY w Y   d d d            n# 1 swxY w Y   | j                                         d S )N1.0)wslinkr   resultz"Method result cannot be serializedr   )msgpackpackbr   rs   r   RESULT_SERIALIZE_ERRORr   rp   r   r   
send_bytesnetwork_call_completed)r   r   contentr   r   r   wrapperpacked_wrapper
websocketschunkwss              r   r   z WslinkHandler.sendWrappedMessage  s      
 
	$]733NN 	 	 	 %  ++*8' ,                        FF	 44Y@WXX

 ! 	7 	7- 7 7 7 7 7 7 7 7,^\JJ 7 7E( 7 7>"$--"6"66666666777 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	3355555sh    A1&A"A1"A&	&A1)A&	*A10A1D
;C-D
-
C7	7D
:C7	;D

DDc                 L   K   d|||dd}|r||d         d<   	 t          j        |          }n-# t          $ r  |d         d= t          j        |          }Y nw xY w|r j        |         gn fd j        D             } j        5   j        4 d {V  t          |t                    D ]$}	|D ]}
|
|
                    |	           d {V   %	 d d d           d {V  n# 1 d {V swxY w Y   d d d            n# 1 swxY w Y    j        	                                 d S )Nr   )codemessage)r   r   r   r   r   c                 *    g | ]}j         |         S rL   )rl   r   s     r   r   z2WslinkHandler.sendWrappedError.<locals>.<listcomp>  s!    @@@!$"1%@@@r!   )
r   r   r   rl   rs   rp   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   s   `          r   r   zWslinkHandler.sendWrappedError  s^     " 
 
  	,'+GGV$	4$]733NN 	4 	4 	4 ($]733NNN	4 ATi())@@@@t/?@@@ 	 ! 	7 	7- 7 7 7 7 7 7 7 7,^\JJ 7 7E( 7 7>"$--"6"66666666777 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	3355555sE   0 'AAD ;C#D #
C-	-D 0C-	1D  DDc                     |r|gnt          | j                  }|D ]5}|                     |          r| j                            ||||           6d S )N)r   r   )r   rl   r   rq   ry   )r   topicr   r   r   client_listclients          r   ry   zWslinkHandler.publish  sy    %.JykkD9I4J4J! 	 	F))&11  (($,C	 )   	 	r!   c                 6    | j                             |          S r   )rq   rz   )r   r   s     r   rz   zWslinkHandler.addAttachment  s    --g666r!   c                     || _         d S r   )r   )r   	newSecrets     r   	setSecretzWslinkHandler.setSecret  s    r!   r   )NF)r   NF)NN)rS   rT   rU   r   r   r   ru   rV   r   r   r   r   r   r   r   r   r   r   r   r   r   ry   rz   r   rL   r!   r   rY   rY      s       #4 #4 #4 #4 #4 #4J' ' '# # #     X  . . X.	; 	; 	;	0 	0 	0' ' 'RF F FV V Vp  3 3 3"9 9 9
 
 
 
* RW%6 %6 %6 %6N"6 "6 "6 "6H	 	 	 	7 7 7         r!   rY   )r   r   r`   loggingosr   r   r   r   wslink.chunkingr   r   wslink.publishr   wslink.websocketr   r   r   r   r   CLIENT_ERRORr&   environr'   r   	getLoggerrS   rD   r   rY   rL   r!   r   <module>r	     sT       				      % % % % % % 6 6 6 6 6 6 6 6 ) ) ) ) ) ) + + + + + +     s2:>>"7CCDD		8	$	$e e e e e e e ePb  b  b  b  b  b  b  b  b  b r!   