1- from re import A
2- from typing import Any , Callable , Optional , Protocol as ProtocolType
3- from olink .core .types import Base , LogLevel , MsgType , Name
4- from olink .core .node import BaseNode
5- from olink .core .protocol import Protocol
61
2+ from typing import Any , Optional , Callable
3+ from olink .core import LogLevel , MsgType , BaseNode , Protocol
4+ from .registry import ClientRegistry , get_client_registry
5+ from .sink import IObjectSink
76
87class InvokeReplyArg :
98 def __init__ (self , name : str , value : Any ):
@@ -16,108 +15,6 @@ def __init__(self, name: str, value: Any):
1615
1716InvokeReplyFunc = Callable [[InvokeReplyArg ], None ]
1817
19-
20- class IObjectSink (ProtocolType ):
21- # interface for object sinks
22- def olink_object_name () -> str :
23- # return object name
24- raise NotImplementedError ()
25-
26- def olink_on_signal (self , name : str , args : list [Any ]) -> None :
27- # called on signal message
28- raise NotImplementedError ()
29-
30- def olink_on_property_changed (self , name : str , value : Any ) -> None :
31- # called on property changed message
32- raise NotImplementedError ()
33-
34- def olink_on_init (self , name : str , props : object , node : "ClientNode" ):
35- # called on init message
36- raise NotImplementedError ()
37-
38- def olink_on_release (self ) -> None :
39- # called when sink is released
40- raise NotImplementedError ()
41-
42-
43- class SinkToClientEntry :
44- # entry in the client registry
45- sink : IObjectSink = None
46- node : "ClientNode" = None
47-
48- def __init__ (self , sink = None ):
49- self .sink = sink
50- self .node = None
51-
52-
53- class ClientRegistry (Base ):
54- # client side registry to link sinks to nodes
55- entries : dict [str , SinkToClientEntry ] = {}
56-
57- def remove_node (self , node : "ClientNode" ):
58- # remove node from all sinks
59- for entry in self .entries .values ():
60- if entry .node is node :
61- entry .node = None
62-
63- def add_node_to_sink (self , name : str , node : "ClientNode" ):
64- # add not to named sink
65- self ._entry (name ).node = node
66-
67- def remove_node_from_sink (self , name : str , node : "ClientNode" ):
68- # remove node from named sink
69- resource = Name .resource_from_name (name )
70- if resource in self .entries :
71- if self .entries [resource ].node is node :
72- self .entries [resource ].node = None
73- else :
74- self .emit_log (
75- LogLevel .DEBUG , f"unlink node failed, not the same node: { resource } "
76- )
77-
78- def register_sink (self , sink : IObjectSink ) -> "ClientNode" :
79- # register sink using object name
80- name = sink .olink_object_name ()
81- entry = self ._entry (name )
82- entry .sink = sink
83- return entry .node
84-
85- def unregister_sink (self , sink : IObjectSink ):
86- # unregister sink using object name
87- name = sink .olink_object_name ()
88- self ._remove_entry (name )
89-
90- def get_sink (self , name : str ) -> Optional [IObjectSink ]:
91- # get sink using name
92- return self ._entry (name ).sink
93-
94- def get_node (self , name : str ) -> Optional ["ClientNode" ]:
95- # get node using name
96- return self ._entry (name ).node
97-
98- def _entry (self , name : str ) -> SinkToClientEntry :
99- # get an entry by name
100- resource = Name .resource_from_name (name )
101- if not resource in self .entries :
102- self .emit_log (LogLevel .DEBUG , f"add new resource: { resource } " )
103- self .entries [resource ] = SinkToClientEntry ()
104- return self .entries [resource ]
105-
106- def _remove_entry (self , name : str ) -> None :
107- # remove an entry by name
108- resource = Name .resource_from_name (name )
109- del self .entries [resource ]
110-
111-
112- # global client registry
113- _registry = ClientRegistry ()
114-
115-
116- def get_client_registry () -> ClientRegistry :
117- # get global client registry
118- return _registry
119-
120-
12118class ClientNode (BaseNode ):
12219 # client side node
12320 invokes_pending : dict [int , InvokeReplyFunc ] = {}
@@ -143,7 +40,7 @@ def invoke_remote(
14340 self .emit_write (Protocol .invoke_message (request_id , name , args ))
14441
14542 def set_remote_property (self , name : str , value : Any ) -> None :
146- # send remote propertymessage
43+ # send remote property message
14744 self .emit_log (LogLevel .DEBUG , f"ClientNode.set_remote_property: { name } { value } " )
14845 self .emit_write (Protocol .set_property_message (name , value ))
14946
@@ -177,7 +74,7 @@ def link_remote(self, name: str):
17774 self .emit_write (Protocol .link_message (name ))
17875
17976 def unlink_remote (self , name : str ):
180- # unlink this node froom sink and send an unlink message
77+ # unlink this node from sink and send an unlink message
18178 self .emit_log (LogLevel .DEBUG , f"ClientNode.unlink_remote: { name } " )
18279 self .emit_write (Protocol .unlink_message (name ))
18380 self .registry ().remove_node_from_sink (name , self )
0 commit comments