
    t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                  j                  dd            Z ej"                  e      Z G d d	      Z G d
 d      Zy)    N)	UnChunkergenerate_chunks)asynchronous   )StateWSLINK_MAX_MSG_SIZEi  @ c                   L    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y)WsLinkSessionizsystem:c0:0c                     t        j                         | _        t        j                         | _        || _        d| _        d| _        i | _        d | _	        t               | _        i | _        y )Nr   r   )asyncioget_running_looploopLockattachment_atomicws	msg_countbin_idsubscriptions	client_idr   	unchunkerin_flight_rpc)selfr   s     @/DATA/.local/lib/python3.12/site-packages/trame_server/client.py__init__zWsLinkSession.__init__   sU    ,,.	!("    c                   K   d|vry |j                  d      }|j                  d      \  }}}| j                  j                  |      }d|v r[|r"|j                  |j                  dd             nt	        d|j                  d             | j                  j                  |       y |j                  d      }|dk(  r|r|j                  |       |dk(  r-|| j                  v r|}| j                  |   D ]  }		  |	|        |d
k(  r|t        j                  k(  r\|j                  d      | _        | j                  j                  |j                  d             |j                  | j                         n|j                  |       |r| j                  j                  |       y y # t        $ r" t	        d	       t        j                          Y w xY ww)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"   s    wT"'-||C'8$)W##''/ g$$KK8 ow{{7';<""6* [[*
 u!!*- y Y$2D2D%DE((3*uI 4 x...!+
!;33JNN<4PQ!!$..1!!*- ""6*  ! *78'')*s+   C6G9F'B&G'(GGGGc                 B  K   | j                   2 3 d {   }|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       nz|j                  t        j                  j                  k(  rt        d       nG|j                  t        j                  j                  k(  r t        j                  d|j                         |j                  t        j                  j                  k(  sE| j                  j                  |j                        }|n| j!                  |       d {    7 7 	6 y w)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     	=#xx7,,222gW..666i W..555hW..444gW..333 MsxxXxx7,,333#~~;;CHHE+..|<<<	= = !sD   FFFFD;F'F=FFFFFFc                   K   t         j                  }| j                  j                         }d|d|gi d}|| j                  |<   	 t        j                  |      }| j                  4 d {    t        |t              D ]2  }| j                  | j                  j                  |       d {    4 d d d       d {    |S # t        $ r |d   d= t        j                  |      }Y w xY w7 7 D7 4# 1 d {  7  sw Y   |S xY ww)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     ##yy&&($H
 #'3	4$]]73N
 )))(F77&'',,U333 G *)
   	4 ($]]73N	4 * 4 *)))
 s   ADC D+C1,D/ C7C7.C3/C75D C5D$C.+D-C..D3C75D7D
=D >D
DNc                 n  K   | xj                   dz  c_         d| j                   d| j                    }| j                  j                         }|| j                  |<   |g }|i }d||||d}	 t        j                  |      }| j                  4 d {    t        |t              D ]2  }| j                  | j                  j                  |       d {    4 d d d       d {    |S # t        $ r |d   d= t        j                  |      }Y w xY w7 7 D7 4# 1 d {  7  sw Y   |S xY ww)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   s0    !T^^$Adnn%56yy&&("&3<D>F 
	4$]]73N
 )))(F77&'',,U333 G *)
   	4 ($]]73N	4 * 4 *)))
 s   A+D5.C/ D5DD5 D8DDDD5(D)D5/$DD5DD5DD5D2%D(&D2-D5c                 ~    || j                   vr|g| j                   |<   y | j                   |   j                  |       y N)r   append)r   topiccallbacks      r   register_subscriptionz#WsLinkSession.register_subscription   s;    ***)1
Du%u%,,X6r   c                     | j                   j                  |g       }||v r|j                  |       t        |      dk(  r+|| j                   v r| j                   j	                  |       y y y )Nr   )r   r&   removelenr*   )r   rc   rd   	callbackss       r   unregister_subscriptionz%WsLinkSession.unregister_subscription   se    &&**5"5	y X&y>Q5D,>,>#>""5) $?r   c                     t        | j                  j                               }|D ]  }| j                  j                  |        y ra   )listr   keysr*   )r   topicsrc   s      r   clear_subscriptionsz!WsLinkSession.clear_subscriptions   s9    d((--/0E""5) r   c                 n   K   | j                   r#| j                   j                          d {    y y 7 wra   )r   closer   s    r   rq   zWsLinkSession.close   s(     77''--/!! !   *535NN)__name__
__module____qualname__CLIENT_ERRORr/   r   r:   rK   r]   r_   re   rj   ro   rq    r   r   r
   r
      s:    LG	 2+h="2>7**
"r   r
   c                   j    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y)Clientz
    Client implementation for driving a remote trame server with its shared state and
    trigger method calls in plain python.
    Nc                     d| _         d | _        || _        |i n|| _        || _        i | _        t        || j                  |      | _        y )Nr   )	commit_fn
hot_reload)	
_connected_session_url_configr~   _change_callbacksr   _push_state_state)r   urlconfig
translatorr~   s        r   r   zClient.__init__   sP    	#^r %!# $"2"2z
r   c                 B  K   | j                   ry d| _         i | j                  |}|| j                  }t        j                         4 d {   }|j                  |      4 d {   }t        |      | _        | j                  j                          | j                  j                  d| j                         d| _         t        j                  | j                  j                               } | j                  j                  di | d {    | d {    d d d       d {    d d d       d {    | j                  j!                          d | _        d| _         y 7 7 7 ]7 U7 G# 1 d {  7  sw Y   WxY w7 N# 1 d {  7  sw Y   ^xY ww)Nr   ztrame.state.topic   r   ry   )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   sB    ??+DLL+F+;))C((**g))#.." -b 1!!#33')>)> #$#//0D0D0FG(dmm((26222

 /. +* 	))+ +. 3 /... +***s   AFE'FF
'E*(F
+B$E3E-	E3E/E3F
)E1*F
.F9F:.F*F
-E3/E31F
3F	9E<:F	F
F
FFFFc                 n   K   | j                   r#| j                   j                          d {    y y 7 wra   )r   rq   rr   s    r   	diconnectzClient.diconnect   s+     ==--%%''' 'rs   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 }|j                         D ]  \  }}t        |t              rWd|v rSt        |j                  d            }i }|j                         D ]  \  }}||vs|||<    |j                  ||d       m|j                  ||d        t        j                  | j                   j                  d|g             y y y )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    ==T]]44@E#kkm
UeT*yE/A #EIIi$8 9I "I %1I-+,IaL !. LLy!ABLLu!=> , $$T]]%7%78Lug%VW A=r   c                 |    | j                   5  | j                   j                  |       d d d        y # 1 sw Y   y xY wra   )r   update)r   modified_states     r   r   zClient._on_state_update	  s%    ZZJJn- ZZs   2;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                    K   |g }|i }| j                   j                  d|||g       d {   }| d {   S 7 7 w)Nztrame.trigger)r   r_   )r   namerQ   rR   responses        r   call_triggerzClient.call_trigger  sL     <D>F++OdD&=QRR~ Ss   +A <	A >A A )NNNFra   rt   )ru   rv   rw   __doc__r   r   r   propertyr   r   r   r   r   r   ry   r   r   r{   r{      sb    

 2( 	" 	"X.    r   r{   )r   loggingosr-   rA   rT   wslink.chunkingr   r   trame_server.utilsr   r   r   intenvironr&   rV   	getLoggerru   rD   r
   r{   ry   r   r   <module>r      se      	    6 + 2::>>"7AB			8	$a" a"Hh hr   