4
4
"""
5
5
6
6
import logging
7
- from typing import Any , Dict , Optional , Tuple , Type , TypeVar
7
+ from typing import Any , Dict , Optional , Tuple , TypeVar
8
8
9
9
from idom .core .component import ComponentConstructor
10
10
from idom .widgets .utils import MountFunc , MultiViewMount , hotswap , multiview
11
11
12
- from .base import AbstractRenderServer
12
+ from .proto import Server , ServerFactory
13
13
from .utils import find_available_port , find_builtin_server_type
14
14
15
15
16
+ DEFAULT_SERVER_FACTORY = find_builtin_server_type ("PerClientStateServer" )
17
+
16
18
logger = logging .getLogger (__name__ )
17
- _S = TypeVar ("_S" , bound = AbstractRenderServer [Any , Any ])
19
+
20
+ _App = TypeVar ("_App" )
21
+ _Config = TypeVar ("_Config" )
18
22
19
23
20
24
def run (
21
25
component : ComponentConstructor ,
22
- server_type : Type [ _S ] = find_builtin_server_type ( "PerClientStateServer" ) ,
26
+ server_type : ServerFactory [ _App , _Config ] = DEFAULT_SERVER_FACTORY ,
23
27
host : str = "127.0.0.1" ,
24
28
port : Optional [int ] = None ,
25
29
server_config : Optional [Any ] = None ,
26
30
run_kwargs : Optional [Dict [str , Any ]] = None ,
27
31
app : Optional [Any ] = None ,
28
32
daemon : bool = False ,
29
- ) -> _S :
33
+ ) -> Server [ _App ] :
30
34
"""A utility for quickly running a render server with minimal boilerplate
31
35
32
36
Parameters:
@@ -41,8 +45,8 @@ def run(
41
45
server_config:
42
46
Options passed to configure the server.
43
47
run_kwargs:
44
- Keyword arguments passed to the :meth:`AbstractRenderServer .run`
45
- or :meth:`AbstractRenderServer .run_in_thread` methods of the server
48
+ Keyword arguments passed to the :meth:`~idom.server.proto.Server .run`
49
+ or :meth:`~idom.server.proto.Server .run_in_thread` methods of the server
46
50
depending on whether ``daemon`` is set or not.
47
51
app:
48
52
Register the server to an existing application and run that.
@@ -58,12 +62,8 @@ def run(
58
62
if port is None : # pragma: no cover
59
63
port = find_available_port (host )
60
64
61
- logger .info (f"Using { server_type .__module__ } .{ server_type .__name__ } " )
62
-
63
- server = server_type (component , server_config )
64
-
65
- if app is not None : # pragma: no cover
66
- server .register (app )
65
+ server = server_type (component , server_config , app )
66
+ logger .info (f"Using { server } " )
67
67
68
68
run_server = server .run if not daemon else server .run_in_thread
69
69
run_server (host , port , ** (run_kwargs or {})) # type: ignore
@@ -72,13 +72,13 @@ def run(
72
72
73
73
74
74
def multiview_server (
75
- server_type : Type [ _S ] ,
75
+ server_type : ServerFactory [ _App , _Config ] = DEFAULT_SERVER_FACTORY ,
76
76
host : str = "127.0.0.1" ,
77
77
port : Optional [int ] = None ,
78
- server_config : Optional [Any ] = None ,
78
+ server_config : Optional [_Config ] = None ,
79
79
run_kwargs : Optional [Dict [str , Any ]] = None ,
80
80
app : Optional [Any ] = None ,
81
- ) -> Tuple [MultiViewMount , _S ]:
81
+ ) -> Tuple [MultiViewMount , Server [ _App ] ]:
82
82
"""Set up a server where views can be dynamically added.
83
83
84
84
In other words this allows the user to work with IDOM in an imperative manner.
@@ -89,8 +89,8 @@ def multiview_server(
89
89
server: The server type to start up as a daemon
90
90
host: The server hostname
91
91
port: The server port number
92
- server_config: Value passed to :meth:`AbstractRenderServer.configure `
93
- run_kwargs: Keyword args passed to :meth:`AbstractRenderServer .run_in_thread`
92
+ server_config: Value passed to :meth:`~idom.server.proto.ServerFactory `
93
+ run_kwargs: Keyword args passed to :meth:`~idom.server.proto.Server .run_in_thread`
94
94
app: Optionally provide a prexisting application to register to
95
95
96
96
Returns:
@@ -114,14 +114,14 @@ def multiview_server(
114
114
115
115
116
116
def hotswap_server (
117
- server_type : Type [ _S ] ,
117
+ server_type : ServerFactory [ _App , _Config ] = DEFAULT_SERVER_FACTORY ,
118
118
host : str = "127.0.0.1" ,
119
119
port : Optional [int ] = None ,
120
- server_config : Optional [Any ] = None ,
120
+ server_config : Optional [_Config ] = None ,
121
121
run_kwargs : Optional [Dict [str , Any ]] = None ,
122
122
app : Optional [Any ] = None ,
123
123
sync_views : bool = False ,
124
- ) -> Tuple [MountFunc , _S ]:
124
+ ) -> Tuple [MountFunc , Server [ _App ] ]:
125
125
"""Set up a server where views can be dynamically swapped out.
126
126
127
127
In other words this allows the user to work with IDOM in an imperative manner.
@@ -132,8 +132,8 @@ def hotswap_server(
132
132
server: The server type to start up as a daemon
133
133
host: The server hostname
134
134
port: The server port number
135
- server_config: Value passed to :meth:`AbstractRenderServer.configure `
136
- run_kwargs: Keyword args passed to :meth:`AbstractRenderServer .run_in_thread`
135
+ server_config: Value passed to :meth:`~idom.server.proto.ServerFactory `
136
+ run_kwargs: Keyword args passed to :meth:`~idom.server.proto.Server .run_in_thread`
137
137
app: Optionally provide a prexisting application to register to
138
138
sync_views: Whether to update all displays with newly mounted components
139
139
0 commit comments