3232from viam .resource .registry import Registry
3333from viam .resource .types import API , RESOURCE_TYPE_COMPONENT , RESOURCE_TYPE_SERVICE , Model , ResourceName , resource_name_from_string
3434from viam .robot .client import RobotClient
35- from viam .rpc .dial import DialOptions
35+ from viam .rpc .dial import DialOptions , _host_port_from_url
3636from viam .rpc .server import Server
3737
3838# These imports are required to register build-in resources with the registry
@@ -73,7 +73,8 @@ def _parse_module_args() -> argparse.Namespace:
7373 p = argparse .ArgumentParser (description = "Start this viam python module" )
7474 p .add_argument ("socket_path" , help = "path where this module will serve a unix socket" )
7575 p .add_argument ("--log-level" , type = lambda name : pylogging ._nameToLevel [name .upper ()], default = logging .INFO )
76- return p .parse_args ()
76+ p .add_argument ("--tcp-mode" , action = 'store_true' )
77+ return p .parse_known_args ()[0 ]
7778
7879
7980class Module :
@@ -82,6 +83,7 @@ class Module:
8283 _ready : bool
8384 _log_level : int
8485 _lock : Lock
86+ _tcp_mode : bool
8587 parent : Optional [RobotClient ] = None
8688 server : Server
8789 logger : pylogging .Logger
@@ -100,7 +102,7 @@ def from_args(cls) -> Self:
100102 Module: a new Module instance
101103 """
102104 args = _parse_module_args ()
103- return cls (args .socket_path , log_level = args .log_level )
105+ return cls (args .socket_path , log_level = args .log_level , tcp_mode = args . tcp_mode )
104106
105107 @classmethod
106108 async def run_with_models (cls , * models : ResourceBase ):
@@ -132,7 +134,7 @@ async def run_from_registry(cls):
132134 module .add_model_from_registry (* key .split ("/" )) # pyright: ignore [reportArgumentType]
133135 await module .start ()
134136
135- def __init__ (self , address : str , * , log_level : int = logging .INFO ) -> None :
137+ def __init__ (self , address : str , * , log_level : int = logging .INFO , tcp_mode : bool = False ) -> None :
136138 # When a module is launched by viam-server, its stdout is not connected to a tty. In
137139 # response, python disables line buffering, which prevents `print` statements from being
138140 # immediately flushed to viam-server. This behavior can be confusing, interfere with
@@ -143,6 +145,7 @@ def __init__(self, address: str, *, log_level: int = logging.INFO) -> None:
143145 if isinstance (sys .stderr , io .TextIOWrapper ):
144146 sys .stderr .reconfigure (line_buffering = True )
145147 self ._address = address
148+ self ._tcp_mode = tcp_mode
146149 self .server = Server (resources = [], module_service = ModuleRPCService (self ))
147150 self ._log_level = log_level
148151
@@ -188,7 +191,11 @@ async def _get_dependencies(self, dependencies: Sequence[str]) -> Mapping[Resour
188191 async def start (self ):
189192 """Start the module service and gRPC server"""
190193 try :
191- await self .server .serve (log_level = self ._log_level , path = self ._address )
194+ if self ._tcp_mode :
195+ host , port = _host_port_from_url (self ._address )
196+ await self .server .serve (log_level = self ._log_level , host = host , port = port )
197+ else :
198+ await self .server .serve (log_level = self ._log_level , path = self ._address )
192199 finally :
193200 await self .stop ()
194201
0 commit comments