
    t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y)    N)Path)profiler)registerserver)ServerProtocol)TRAME_NON_INIT_VALUE)clean_stateloggerc                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)NetworkMonitorz
    Provide context manager for increase/decrease pending request
    either synchronously or asynchronously.

    The Asynchronous version also await completion.
    c                 x    t        j                  d      | _        d| _        t	        j
                         | _        y )Nztrame.networkr   )r   TimertimerpendingasyncioEventeventselfs    B/DATA/.local/lib/python3.12/site-packages/trame_server/protocol.py__init__zNetworkMonitor.__init__   s&    ^^O4
]]_
    c                 8    | j                   j                          y)zTrigger completion eventN)r   setr   s    r   network_call_completedz%NetworkMonitor.network_call_completed   s    

r   c                     | j                   dk(  r| j                  j                          | xj                   dz  c_         y)zIncrease pending requestr      N)r   r   on_startr   ___s      r   on_enterzNetworkMonitor.on_enter    s,    <<1JJ!r   c                 
   | xj                   dz  c_         | j                   dk(  r| j                  j                          | j                   dk(  r6| j                  j	                         s| j                  j                          yyy)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&   s]    <<1JJ<<1TZZ%6%6%8JJNN &9r   c                 &    | j                          | S Nr#   r   s    r   	__enter__zNetworkMonitor.__enter__1   s    r   c                 $    | j                          y r)   )r'   )r   exc_type	exc_valueexc_tracebacks       r   __exit__zNetworkMonitor.__exit__5   s    r   c                 .   K   | j                          | S wr)   r*   r   s    r   
__aenter__zNetworkMonitor.__aenter__9   s     s   c                 `   K   | j                          | j                          d {    y 7 wr)   )r'   
completion)r   exc_texc_vexc_tbs       r   	__aexit__zNetworkMonitor.__aexit__=   s     oos   $.,.c                    K   | j                   rJ| j                  j                          | j                  j                          d{    | j                   rIyy7 w)z/Await completion of any pending network requestN)r   r   clearwaitr   s    r   r4   zNetworkMonitor.completionA   s=     llJJ**//### ll#s   AAAAAN)__name__
__module____qualname____doc__r   r   r#   r'   r+   r0   r2   r8   r4    r   r   r   r      s4    %
 $r   r   c                   R    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<   y )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   sY      0"
 -0?P0Q,R

()*-fnn_.M*N

&'r   c                 .    t        j                  |        y r)   )r   add_arguments)parsers    r   rO   zCoreServer.add_argumentsY   s    V$r   c                    | j                   rUt        | j                         j                  d      5 }|j                         j	                         t
        _        d d d        y | j                  t
        _        y # 1 sw Y   y xY w)Nr)authKeyFiler   openreadstriprB   authentication_tokenauthKey)argskey_files     r   	configurezCoreServer.configure]   s\    d&&',,S1X2:--/2G2G2I
/ 21 /3llJ+ 21s   (A88Bc           	      @    t        j                  d| t        |||d|S )N)rI   protocoldisableLoggingbackend	exec_moder@   )r   start_webserverrB   )rI   r^   r_   r`   kwargss        r   server_startzCoreServer.server_starte   s5     %% 
)
 
 	
r   c                  ,    t        j                          y r)   )r   stop_webserverr@   r   r   server_stopzCoreServer.server_stopw   s    r   c                     t        |   |i | t               | _        | j                  D ]  }| j                  |_         y r)   )superr   r   network_monitorlinkProtocols)r   rY   rb   r]   	__class__s       r   r   zCoreServer.__init__   s@    $)&)  ./**H'+';';H$ +r   c                 :   i | _         t        j                  | _        | | j                  _        | j                  | j                  j
                  _        i | _        | j                  j                  D ]
  } ||         | j                  t        j                         y r)   )

rpcMethodsrB   r   _root_protocolri   context_clients_state_protocols_to_configureupdateSecretrW   )r   r[   s     r   
initializezCoreServer.initialize   ss     ''%)".2.B.B+ <<IdO = 	*99:r   c                 f   || j                   _        | j                   j                  j                  j	                         rr|j
                  j                  j                  }t        |      }|j                          | j                   j                  j                  |       |j                  |       y y r)   )r   _server
controlleron_server_bindexistsapprouter
_resourceslistr:   extend)r   ru   server_routeswslink_routess       r   
set_serverzCoreServer.set_server   s    %;;!!00779 $KK..99M /M!KK""11':  / :r   c                 F   || j                   _        | j                   j                  dk  rvd| j                   _        | j                   j                  j	                          | j                   j
                  j	                          | j                   j                  j                  j                  d| j                   j                  j                  j                                | j                   j                  j                  j                         rH | j                   j                  j                  di | j                   j                  j                          | j                   j                  j                         s&| j                   j                  j!                  d       y y y )N   	exceptionTr@   )r   _running_port_running_stagestatereadyro   r]   log_emitteradd_event_listenerrv   on_exceptionenable_emptyon_server_readyrx   to_dictdone
set_result)r   	port_useds     r   port_callbackzCoreServer.port_callback   s   $-!;;%%))*DKK&KK##%KK%%' KK  ,,??T[[33@@MMO
 {{%%55<<>6&&66U9J9J9R9R9TU ;;$$))+!!,,T2 , *r   c                 j   t        | j                        dk(  r~d }| j                         D ]h  }t        j                  |j
                  |      D ]C  }|d   }d|j                  v s|j                  d   d   }d|v s.|d   }||f| j                  |<   E j || j                  v r| j                  |   S y )Nr   c                 Z    t        j                  |       xs t        j                  |       S r)   )inspectismethod
isfunction)xs    r   	is_methodz*CoreServer.getRPCMethod.<locals>.is_method   s#    ''*Cg.@.@.CCr   r   _wslinkurisuri)lenrm   getLinkProtocolsr   
getmembersrk   __dict__)r   namer   protocolObjectkprocuri_infor   s           r   getRPCMethodzCoreServer.getRPCMethod   s    t1$D #'"7"7"9 ++N,D,DiPAQ4D$5#'==#?#B H,"*5/C4BD3IDOOC0 Q #: 4??"??4((r   c                 b   t        |      \  }}i }|j                         D ]F  \  }}| j                  j                  |t              }|j                  |t              }	||	k7  sB|||<   H |r)t        j                  |       | j                  d||       | j                  j                  |       y )Ntrame.state.topicskip_last_active_client)	r
   itemsrp   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J((*JC**..s4HIH nnS*>?G7"%*c"	 % ]+LL#(?   	"":.r   c                 R    t        j                  |       | j                  d|       y )Nztrame.actions.topic)r   
action_s2cr   )r   actionss     r   push_actionszCoreServer.push_actions   s    '"*G4r   c                 ,    |D ]  }| j                   |=  y r)   )rp   )r   keysr   s      r   clear_state_client_cachez#CoreServer.clear_state_client_cache   s    A##A& r   ztrame.force.pushc                     |D ci c]  }|| j                   j                  |    }}|r| j                  d|d       y y c c}w )Nr   Fr   )r   r   r   )r   r   r   r   s       r   force_push_statezCoreServer.force_push_state   sR    @DEdkk//44ELL#(-    Fs   !A ztrame.lifecycle.updatec                 l    | j                   j                  d|    }|j                         r |        y y )Non_)r   rv   rx   )r   r   _fns      r   life_cycle_updatezCoreServer.life_cycle_update   s/    kk$$s4&\2::<E r   ztrame.error.clientc                     | j                   j                  j                  j                         r&| j                   j                  j                  |       y t	        d|        y )Nz JS Error => )r   rv   on_errorrx   print)r   messages     r   js_errorzCoreServer.js_error  sE    ;;!!**113KK""++G4M'+,r   ztrame.state.getc                     | j                   j                         }t        |j                  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  sT    {{335L,,Wb9:A5<5"5]+r   ztrame.triggerc                 h  K   t        j                  |||d       | j                  j                  5  | j                  j                  j                  |      }|r2 ||i |}t        j                  |      r
| d {   }|cd d d        S t        d| d       d d d        y 7 '# 1 sw Y   y xY ww)N)r   rY   rb   zTrigger z seems to be missing)	r   
action_c2sr   r   rv   
trigger_fnr   isawaitabler   )r   r   rY   rb   fnresults         r   triggerzCoreServer.trigger  s     4HI[[''2248BT,V,&&v.#)\F  HTF"678  	 *  s;   0B2A
B&<B$=B&
B2B&	B2$B&&B/+B2ztrame.state.updatec                 4   t        j                  |       | j                  j                  5  i }|D ]  }|j	                  d      ||d   <    | j                  |d       | j                  j                  j                  |       d d d        y # 1 sw Y   y xY w)Nr   r   Tr   )r   	state_c2sr   r   r   r   r   )r   changesclient_statechanges       r   update_statezCoreServer.update_state+  s~    ![[L!.4jj.AVE]+ " ""<"N KK$$\2 s   ABB)Faiohttpmain)F)r<   r=   r>   rW   r   staticmethodrM   rO   r[   rc   rf   r   rs   r   r   r   r   r   r   	exportRpcr   r   r   r   r   r   __classcell__)rk   s   @r   rB   rB   H   sB   *F O O % % ; ;  	
 
"    <
;	03,0/05' !" # '( ) #$- %-  ! "    #$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 26$ 6$rp3 p3r   