
    +j##                         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mZ d dl	m
Z
 ddlmZ  eej                            dd                    Z ej        e          Z G d d	          Z G d
 d          ZdS )    N)	UnChunkergenerate_chunks)asynchronous   )StateWSLINK_MAX_MSG_SIZEi  @ c                   N    e Zd ZdZdZd Zd Zd Zd ZddZ	d	 Z
d
 Zd Zd ZdS )WsLinkSessionizsystem:c0:0c                     t          j                    | _        t          j                    | _        || _        d| _        d| _        i | _        d | _	        t                      | _        i | _        d S )Nr   r   )asyncioget_running_looploopLockattachment_atomicws	msg_countbin_idsubscriptions	client_idr   	unchunkerin_flight_rpc)selfr   s     M/DATA/AppData/hermes/venv/lib/python3.11/site-packages/trame_server/client.py__init__zWsLinkSession.__init__   s]    ,..	!("    c                   K   d|vrd S |                     d          }|                    d          \  }}}| j                             |          }d|v rk|r*|                    |                     dd                     n#t	          d|                     d                     | j                            |           d S |                     d          }|dk    r|r|                    |           |dk    rY|| j        v rP|}| j        |         D ]@}		  |	|           # t          $ r% t	          d	           t          j
                     Y =w xY w|d
k    r|t          j        k    rb|                     d          | _        | j                            |                     d                     |                    | j                   n|                    |           |r| j                            |           d S d S )Nid:errorzServer errorzServer error:resultrpcpublishzSubscription callback errorsystemclientID
maxMsgSize)getsplitr   set_exceptionprintpop
set_resultr   	Exception	traceback	print_excr
   AUTH_IDr   r   set_max_message_size)
r   payloadmsg_idmsg_type	msg_topicmsg_idxfuture
msg_resulteventfns
             r   on_msg_completezWsLinkSession.on_msg_complete"   sE     wFT""'-||C'8'8$)W#''// g =$$KK88    ow{{7';';<<<""6***F [[**
 u .!!*--- y  Y$2D%D%DE(3 * **BuIIII  * * *7888')))))*
 x...!+
!;!;33JNN<4P4PQQQ!!$.1111!!*---  	+""6*****	+ 	+s   D,EEc                   K   | j         2 3 d {V }|j        t          j        j        k    rt          d           n|j        t          j        j        k    rt          d           n|j        t          j        j        k    rt          d           nd|j        t          j        j        k    rt          d           n:|j        t          j        j	        k    r t                              d|j                   |j        t          j        j        k    r<| j                            |j                  }||                     |           d {V  A6 d S )NCLOSECLOSINGCLOSEDERRORz*wslink is not expecting text message:
> %s)r   typeaiohttp	WSMsgTyper<   r)   r=   r>   r?   TEXTloggercriticaldataBINARYr   process_chunkr:   )r   msgfull_messages      r   listenzWsLinkSession.listenV   s>      	= 	= 	= 	= 	= 	= 	=#x7,222gW.666i    W.555hW.444gW.333 MsxXXXx7,333#~;;CHEE+..|<<<<<<<<< !s   Ec                   K   t           j        }| j                                        }d|d|gi d}|| j        |<   	 t          j        |          }n-# t          $ r  |d         d= t          j        |          }Y nw xY w| j        4 d {V  t          |t                    D ])}| j         | j                            |           d {V  *	 d d d           d {V  n# 1 d {V swxY w Y   |S )N1.0zwslink.hellowslinkr   methodargskwargsr   rF   )r
   r/   r   create_futurer   msgpackpackbr,   r   r   MAX_MSG_SIZEr   
send_bytes)r   rR   keyrespwrapperpacked_wrapperchunks          r   authzWsLinkSession.authg   s     #y&&(($H
 
 #'3	4$]733NN 	4 	4 	4 ($]733NNN	4 ) 	4 	4 	4 	4 	4 	4 	4 	4(FF 4 47&',,U3333333334	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4
 s$   A 'A;:A;A C
C(+C(Nc                   K   | xj         dz  c_         d| j         d| j          }| j                                        }|| j        |<   |g }|i }d||||d}	 t          j        |          }n-# t          $ r  |d         d= t          j        |          }Y nw xY w| j        4 d {V  t          |t                    D ])}| j         | j                            |           d {V  *	 d d d           d {V  n# 1 d {V swxY w Y   |S )Nr   zrpc:r   rM   rN   r   rF   )r   r   r   rS   r   rT   rU   r,   r   r   rV   r   rW   )	r   rP   rQ   rR   rX   rY   rZ   r[   r\   s	            r   callzWsLinkSession.call   s     !6T^66dn66y&&(("&3<D>F 
 
	4$]733NN 	4 	4 	4 ($]733NNN	4 ) 	4 	4 	4 	4 	4 	4 	4 	4(FF 4 47&',,U3333333334	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4
 s%   A. .'BB(A C;;
DDc                 r    || j         vr|g| j         |<   d S | j         |                             |           d S N)r   append)r   topiccallbacks      r   register_subscriptionz#WsLinkSession.register_subscription   sG    ***)1
Du%%%u%,,X66666r   c                     | j                             |g           }||v r|                    |           t          |          dk    r%|| j         v r| j                             |           d S d S d S )Nr   )r   r&   removelenr*   )r   rc   rd   	callbackss       r   unregister_subscriptionz%WsLinkSession.unregister_subscription   s    &**5"55	y  X&&&y>>Q5D,>#>#>""5))))) #>#>r   c                     t          | j                                                  }|D ]}| j                            |           d S ra   )listr   keysr*   )r   topicsrc   s      r   clear_subscriptionsz!WsLinkSession.clear_subscriptions   sQ    d(--//00 	* 	*E""5))))	* 	*r   c                 Z   K   | j         r!| j                                          d {V  d S d S ra   )r   closer   s    r   rq   zWsLinkSession.close   sB      7 	"'--//!!!!!!!!!	" 	"r   NN)__name__
__module____qualname__CLIENT_ERRORr/   r   r:   rK   r]   r_   re   rj   ro   rq    r   r   r
   r
      s        LG	  	  	 2+ 2+ 2+h= = ="  2   >7 7 7* * ** * *
" " " " "r   r
   c                   ~    e Zd ZdZddZddZd Zed             Zd Z	d	 Z
ed
             Zed             ZddZdS )Clientz
    Client implementation for driving a remote trame server with its shared state and
    trigger method calls in plain python.
    NFc                     d| _         d | _        || _        |i n|| _        || _        i | _        t          || j        |          | _        d S )Nr   )	commit_fn
hot_reload)	
_connected_session_url_configr}   _change_callbacksr   _push_state_state)r   urlconfig
translatorr}   s        r   r   zClient.__init__   s]    	#^rr %!# $"2z
 
 
r   c                   K   | j         rd S d| _         i | j        |}|| j        }t          j                    4 d {V }|                    |          4 d {V }t          |          | _        | j        	                                 | j        
                    d| j                   d| _         t          j        | j                                                  } | j        j        di | d {V  | d {V  d d d           d {V  n# 1 d {V swxY w Y   d d d           d {V  n# 1 d {V swxY w Y   | j                                         d | _        d| _         d S )Nr   ztrame.state.topic   r   rx   )r~   r   r   rA   ClientSession
ws_connectr
   r   r   readyre   _on_state_updater   create_taskrK   r]   ro   )r   r   rR   r   sessionr   tasks          r   connectzClient.connect   s     ? 	F+DL+F+;)C(** 
	 
	 
	 
	 
	 
	 
	g))#.. 	 	 	 	 	 	 	" -b 1 1!!###33')>   #$#/0D0D0F0FGG(dm(226222222222






	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 	))+++s7    D1B D<D1
D	D1D	D11
D;>D;c                 Z   K   | j         r!| j                                          d {V  d S d S ra   )r   rq   rr   s    r   	diconnectzClient.diconnect   sF      = 	(-%%'''''''''''	( 	(r   c                     | j         j        S )a;  
        Use as decorator `@server.change(key1, key2, ...)` so the decorated function
        will be called like so `_fn(**state)` when any of the listed key name
        is getting modified from either client or server.

        :param *_args: A list of variable name to monitor
        :type *_args: str
        )r   changerr   s    r   r   zClient.change   s     {!!r   c                    | j         r| j         j        g }|                                D ]\  }}t          |t                    rdd|v r`t          |                    d                    }i }|                                D ]\  }}||vr|||<   |                    ||d           ~|                    ||d           t          j	        | j         
                    d|g                     d S d S d S )N_filter)rX   valueztrame.state.update)r   r   items
isinstancedictsetr&   rb   r   r   r_   )	r   statedeltarX   r   	skip_keys	new_valuekvs	            r   r   zClient._push_state   s   = 	XT]4@E#kkmm 	? 	?
UeT** ?yE/A/A #EIIi$8$8 9 9I "I % - -1I--+,IaLLLy!A!ABBBBLLu!=!=>>>>$T]%7%78Lug%V%VWWWWW	X 	X@@r   c                 z    | j         5  | j                             |           d d d            d S # 1 swxY w Y   d S ra   )r   update)r   modified_states     r   r   zClient._on_state_update	  s    Z 	. 	.Jn---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   044c                     | j         S ra   )r~   rr   s    r   	connectedzClient.connected  s
    r   c                     | j         S ra   )r   rr   s    r   r   zClient.state  s
    {r   c                 n   K   |g }|i }| j                             d|||g           d {V }| d {V S )Nztrame.trigger)r   r_   )r   namerQ   rR   responses        r   call_triggerzClient.call_trigger  s\      <D>F++OdD&=QRRRRRRRR~~~~~~r   )NNNFra   rs   )rt   ru   rv   __doc__r   r   r   propertyr   r   r   r   r   r   rx   r   r   rz   rz      s         

 
 
 
    2( ( ( 	" 	" X	"X X X. . .   X   X     r   rz   )r   loggingosr-   rA   rT   wslink.chunkingr   r   trame_server.utilsr   r   r   intenvironr&   rV   	getLoggerrt   rD   r
   rz   rx   r   r   <module>r      s     				       6 6 6 6 6 6 6 6 + + + + + +      s2:>>"7AABB		8	$	$a" a" a" a" a" a" a" a"Hh h h h h h h h h hr   