
    +j(                         d dl Z d dlZd dl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 d dlmZ d dlmZmZ  G d	 d
          Z G d de          ZdS )    N)Path)profiler)registerserver)ServerProtocol)TRAME_NON_INIT_VALUE)clean_stateloggerc                   H    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )NetworkMonitorz
    Provide context manager for increase/decrease pending request
    either synchronously or asynchronously.

    The Asynchronous version also await completion.
    c                 v    t          j        d          | _        d| _        t	          j                    | _        d S )Nztrame.networkr   )r   TimertimerpendingasyncioEventeventselfs    O/DATA/AppData/hermes/venv/lib/python3.11/site-packages/trame_server/protocol.py__init__zNetworkMonitor.__init__   s+    ^O44
]__


    c                 8    | j                                          dS )zTrigger completion eventN)r   setr   s    r   network_call_completedz%NetworkMonitor.network_call_completed   s    
r   c                 n    | j         dk    r| j                                         | xj         dz  c_         dS )zIncrease pending requestr      N)r   r   on_startr   ___s      r   on_enterzNetworkMonitor.on_enter    s7    <1J!!!r   c                     | xj         dz  c_         | j         dk    r| j                                         | j         dk    r4| j                                        s| j                                         dS dS dS )zSDecrease pending request and trigger completion event if we reach 0 pending requestr   r   N)r   r   on_endr   is_setr   r    s      r   on_exitzNetworkMonitor.on_exit&   sy    <1J<1TZ%6%6%8%8JNN r   c                 .    |                                   | S Nr#   r   s    r   	__enter__zNetworkMonitor.__enter__1   s    r   c                 .    |                                   d S r)   )r'   )r   exc_type	exc_valueexc_tracebacks       r   __exit__zNetworkMonitor.__exit__5   s    r   c                 2   K   |                                   | S r)   r*   r   s    r   
__aenter__zNetworkMonitor.__aenter__9   s      r   c                 f   K   |                                   |                                  d {V  d S r)   )r'   
completion)r   exc_texc_vexc_tbs       r   	__aexit__zNetworkMonitor.__aexit__=   s;      oor   c                    K   | j         rA| j                                         | j                                         d{V  | j         ?dS dS )z/Await completion of any pending network requestN)r   r   clearwaitr   s    r   r4   zNetworkMonitor.completionA   sh      l 	$J*//######### l 	$ 	$ 	$ 	$ 	$r   N)__name__
__module____qualname____doc__r   r   r#   r'   r+   r0   r2   r8   r4    r   r   r   r      s         % % %
                 $ $ $ $ $r   r   c                       e Zd ZdZdZed             Zed             Zed             Ze	 	 	 dd	            Z	ed
             Z
 fdZd Zd Zd Zd Zd dZd Zd Z ed          d             Z ed          d             Z ed          d             Z ed          d             Z ed          d             Z ed          d             Z xZS )!
CoreServerzwslink-secretNc                     t          j        | j                   | t          _        t          | j        d                   t          j        d<   t          | j        d                   t          j        d<   d S )Nws_max_msg_sizeWSLINK_MAX_MSG_SIZEws_heart_beatWSLINK_HEART_BEAT)r   initialize_loggeroptionsrB   r   strosenvironr   s    r   bind_serverzCoreServer.bind_serverP   s^     000"
 -0?P0Q,R,R
()*-fn_.M*N*N
&'''r   c                 .    t          j        |            d S r)   )r   add_arguments)parsers    r   rO   zCoreServer.add_argumentsY   s    V$$$$$r   c                    | j         rrt          | j                                       d          5 }|                                                                t
          _        d d d            d S # 1 swxY w Y   d S | j        t
          _        d S )Nr)authKeyFiler   openreadstriprB   authentication_tokenauthKey)argskey_files     r   	configurezCoreServer.configure]   s     	;d&'',,S11 JX2:--//2G2G2I2I
/J J J J J J J J J J J J J J J J J J /3lJ+++s   1A--A14A1Faiohttpmainc           	      :    t          j        d| t          |||d|S )N)rI   protocoldisableLoggingbackend	exec_moder@   )r   start_webserverrB   )rI   r`   ra   rb   kwargss        r   server_startzCoreServer.server_starte   s<     % 
)
 
 
 
 	
r   c                  ,    t          j                     d S r)   )r   stop_webserverr@   r   r   server_stopzCoreServer.server_stopw   s    r   c                      t                      j        |i | t                      | _        | j        D ]}| j        |_        d S r)   )superr   r   network_monitorlinkProtocols)r   rY   rd   r_   	__class__s       r   r   zCoreServer.__init__   sY    $)&)))  .//* 	< 	<H'+';H$$	< 	<r   c                     i | _         t          j        | _        | | j        _        | j        | j        j        _        i | _        | j        j        D ]} ||            |                     t          j	                   d S r)   )

rpcMethodsrB   r   _root_protocolrk   context_clients_state_protocols_to_configureupdateSecretrW   )r   r[   s     r   
initializezCoreServer.initialize   su     '%)".2.B+ < 	 	IIdOOOO*9:::::r   c                 8   || j         _        | j         j        j                                        rj|j        j        j        }t          |          }|	                                 | j         j                            |           |
                    |           d S d S r)   )r   _server
controlleron_server_bindexistsapprouter
_resourceslistr:   extend)r   rw   server_routeswslink_routess       r   
set_serverzCoreServer.set_server   s    %;!07799 	0 $K.9M //M!!!K"11':::  /////	0 	0r   c                    || j         _        | j         j        dk     r#d| j         _        | j         j                                         | j         j                                         | j         j        j                            d| j         j	        j
                                                   | j         j	        j                                        r3 | j         j	        j        di | j         j                                         | j         j                                        s#| j         j                            d           d S d S d S )N   	exceptionTr@   )r   _running_port_running_stagestatereadyrq   r_   log_emitteradd_event_listenerrx   on_exceptionenable_emptyon_server_readyrz   to_dictdone
set_result)r   	port_useds     r   port_callbackzCoreServer.port_callback   s)   $-!;%)))*DK&K##%%%K%%''' K ,??T[3@MMOO  
 {%5<<>> V6&6UU9J9R9R9T9TUUU ;$))++ 3!,,T22222! *)3 3r   c                 H   t          | j                  dk    rsd }|                                 D ][}t          j        |j        |          D ]>}|d         }d|j        v r+|j        d         d         }d|v r|d         }||f| j        |<   ?\|| j        v r| j        |         S d S )Nr   c                 R    t          j        |           pt          j        |           S r)   )inspectismethod
isfunction)xs    r   	is_methodz*CoreServer.getRPCMethod.<locals>.is_method   s#    '**Cg.@.C.CCr   r   _wslinkurisuri)lenro   getLinkProtocolsr   
getmembersrm   __dict__)r   namer   protocolObjectkprocuri_infor   s           r   getRPCMethodzCoreServer.getRPCMethod   s    t1$$D D D #'"7"7"9"9 J J +N,DiPP J JAQ4D$55#'=#?#B H,,"*5/C4BD3IDOC0J 4?""?4((tr   c                 ~   t          |          \  }}i }|                                D ]K\  }}| j                            |t                    }|                    |t                    }	||	k    r|||<   L|r,t          j        |           |                     d||           | j                            |           d S )Ntrame.state.topicskip_last_active_client)	r
   itemsrr   getr	   r   	state_s2cpublishupdate)
r   modified_stater   ok
str_valuesstate_to_sendkeyvalueprev_strnew_strs
             r   push_state_changezCoreServer.push_state_change   s    $^44J((** 	+ 	+JC*..s4HIIH nnS*>??G7""%*c"  	]+++LL#(?     	"":.....r   c                 Z    t          j        |           |                     d|           d S )Nztrame.actions.topic)r   
action_s2cr   )r   actionss     r   push_actionszCoreServer.push_actions   s.    '"""*G44444r   c                      |D ]
}| j         |= d S r)   )rr   )r   keysr   s      r   clear_state_client_cachez#CoreServer.clear_state_client_cache   s)     	' 	'A#A&&	' 	'r   ztrame.force.pushc                 \      fd|D             }|r                      d|d           d S d S )Nc                 6    i | ]}|j         j        |         S r@   )r   r   ).0r   r   s     r   
<dictcomp>z/CoreServer.force_push_state.<locals>.<dictcomp>   s%    EEEdk/4EEEr   r   Fr   )r   )r   r   r   s   `  r   force_push_statezCoreServer.force_push_state   s\    EEEEEEE 	LL#(-      	 	r   ztrame.lifecycle.updatec                 p    | j         j        d|          }|                                r |             d S d S )Non_)r   rx   rz   )r   r   _fns      r   life_cycle_updatezCoreServer.life_cycle_update   s@    k$\4\\2::<< 	CEEEEE	 	r   ztrame.error.clientc                     | j         j        j                                        r!| j         j                            |           d S t	          d|            d S )Nz JS Error => )r   rx   on_errorrz   print)r   messages     r   js_errorzCoreServer.js_error  sZ    ;!*1133 	-K"++G44444+'++,,,,,r   ztrame.state.getc                     | j                                         }t          |                    di                     \  }}i |d|i}t	          j        |           |S )Nr   )r   get_server_stater
   r   r   initial_state)r   server_stater   r!   r   s        r   r   zCoreServer.get_server_state  sa    {3355L,,Wb99::A5<5"55]+++r   ztrame.triggerc                 N  K   t          j        |||d           | j        j        5  | j        j                            |          }|r2 ||i |}t          j        |          r| d {V }|cd d d            S t          d| d           d d d            n# 1 swxY w Y   d S )N)r   rY   rd   zTrigger z seems to be missing)	r   
action_c2sr   r   rx   
trigger_fnr   isawaitabler   )r   r   rY   rd   fnresults         r   triggerzCoreServer.trigger  s'     4HHIII[ 	9 	9'22488B T,V,,&v.. *#)\\\\\\F	9 	9 	9 	9 	9 	9 	9 	9 7T777888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 ts   AB;BB!Bztrame.state.updatec                 .   t          j        |           | j        j        5  i }|D ] }|                    d          ||d         <   !|                     |d           | j        j                            |           d d d            d S # 1 swxY w Y   d S )Nr   r   Tr   )r   	state_c2sr   r   r   r   r   )r   changesclient_statechanges       r   update_statezCoreServer.update_state+  s    !!![ 		3 		3L! B B.4jj.A.AVE]++ ""<"NNN K$$\222		3 		3 		3 		3 		3 		3 		3 		3 		3 		3 		3 		3 		3 		3 		3 		3 		3 		3s   AB

BB)Fr\   r]   )F)r<   r=   r>   rW   r   staticmethodrM   rO   r[   re   rh   r   ru   r   r   r   r   r   r   	exportRpcr   r   r   r   r   r   __classcell__)rm   s   @r   rB   rB   H   s4       *F O O \O % % \% ; ; \;  	
 
 
 \
"     \ < < < < <
; 
; 
;	0 	0 	03 3 3,  0/ / / /05 5 5' ' ' Y!""  #" Y'((  )( Y#$$- - %$- Y !!  "! Y    Y#$$3 3 %$3 3 3 3 3r   rB   )r   r   rK   pathlibr   trame_common.utilsr   wslinkr   r   r   wslink.websocketr   trame_server.stater	   trame_server.utilsr
   r   r   rB   r@   r   r   <module>r      s     				       ' ' ' ' ' ' ( ( ( ( ( (       + + + + + + 3 3 3 3 3 3 2 2 2 2 2 2 2 26$ 6$ 6$ 6$ 6$ 6$ 6$ 6$rp3 p3 p3 p3 p3 p3 p3 p3 p3 p3r   