@@ -20,38 +20,56 @@ def _find_default_server_type() -> Optional[Type[AbstractRenderServer[Any, Any]]
2020 pass
2121 else :
2222 return getattr (module , server_name )
23- else :
23+ else : # pragma: no cover
2424 return None
2525
2626
2727def run (
2828 element : ElementConstructor ,
29- server : Optional [
30- Type [AbstractRenderServer [Any , Any ]]
31- ] = _find_default_server_type (),
29+ server_type : Optional [Type [_S ]] = _find_default_server_type (),
3230 host : Optional [str ] = "127.0.0.1" ,
3331 port : Optional [int ] = None ,
32+ server_options : Optional [Any ] = None ,
3433 run_options : Optional [Dict [str , Any ]] = None ,
35- ) -> None :
36- """A utility for quickly running a view with minimal boilerplat"""
37- if server is None :
34+ daemon : bool = False ,
35+ app : Optional [Any ] = None ,
36+ ) -> _S :
37+ """A utility for quickly running a render server with minimal boilerplate
38+
39+ Parameters:
40+ element: The root of the view.
41+ server_type: What server to run. Defaults to a builtin implementation if available.
42+ host: The host string.
43+ port: The port number. Defaults to a dynamically discovered available port.
44+ server_options: Options passed to configure the server.
45+ run_options: Options passed to the server to run it.
46+ daemon: Whether the server should be run in a daemon thread.
47+ app: Register the server to an existing application and run that.
48+
49+ Returns:
50+ The server instance. This isn't really useful unless the server is spawned
51+ as a daemon. Otherwise this function blocks until the server has stopped.
52+ """
53+ if server_type is None : # pragma: no cover
3854 raise ValueError ("No default server available." )
39- if port is None :
55+ if port is None : # pragma: no cover
4056 port = find_available_port (host )
41- server (element ).run (host , port , ** (run_options or {}))
4257
58+ server = server_type (element , server_options )
4359
44- def find_available_port (host : str ) -> int :
45- """Get a port that's available for the given host"""
46- sock = socket ()
47- sock .bind ((host , 0 ))
48- return cast (int , sock .getsockname ()[1 ])
60+ if app is not None :
61+ server .register (app )
62+
63+ run_server = server .run if not daemon else server .daemon
64+ run_server (host , port , ** (run_options or {}))
65+
66+ return server
4967
5068
5169def multiview_server (
52- server : Type [_S ],
53- host : str ,
54- port : int ,
70+ server_type : Type [_S ],
71+ host : Optional [ str ] = "127.0.0.1" ,
72+ port : Optional [ int ] = None ,
5573 server_options : Optional [Any ] = None ,
5674 run_options : Optional [Dict [str , Any ]] = None ,
5775 app : Optional [Any ] = None ,
@@ -75,18 +93,25 @@ def multiview_server(
7593 See :func:`idom.widgets.common.multiview` for details.
7694 """
7795 mount , element = multiview ()
78- server_instance = server (element )
79- server_instance .configure (server_options )
80- if app is not None :
81- server_instance .register (app )
82- server_instance .daemon (host , port , ** (run_options or {}))
83- return mount , server_instance
96+
97+ server = run (
98+ element ,
99+ server_type ,
100+ host ,
101+ port ,
102+ server_options = server_options ,
103+ run_options = run_options ,
104+ daemon = True ,
105+ app = app ,
106+ )
107+
108+ return mount , server
84109
85110
86111def hotswap_server (
87- server : Type [_S ],
88- host : str ,
89- port : int ,
112+ server_type : Type [_S ],
113+ host : Optional [ str ] = "127.0.0.1" ,
114+ port : Optional [ int ] = None ,
90115 server_options : Optional [Any ] = None ,
91116 run_options : Optional [Dict [str , Any ]] = None ,
92117 sync_views : bool = True ,
@@ -112,9 +137,23 @@ def hotswap_server(
112137 See :func:`idom.widgets.common.hotswap` for details.
113138 """
114139 mount , element = hotswap (shared = sync_views )
115- server_instance = server (element )
116- server_instance .configure (server_options )
117- if app is not None :
118- server_instance .register (app )
119- server_instance .daemon (host , port , ** (run_options or {}))
120- return mount , server_instance
140+
141+ server = run (
142+ element ,
143+ server_type ,
144+ host ,
145+ port ,
146+ server_options = server_options ,
147+ run_options = run_options ,
148+ daemon = True ,
149+ app = app ,
150+ )
151+
152+ return mount , server
153+
154+
155+ def find_available_port (host : str ) -> int :
156+ """Get a port that's available for the given host"""
157+ sock = socket ()
158+ sock .bind ((host , 0 ))
159+ return cast (int , sock .getsockname ()[1 ])
0 commit comments