bitconch_jsonrpc_ws_server/
server_builder.rs

1use std::net::SocketAddr;
2use std::sync::Arc;
3
4use core;
5use server_utils;
6use server_utils::cors::Origin;
7use server_utils::hosts::{Host, DomainsValidation};
8use server_utils::reactor::UninitializedExecutor;
9use server_utils::session::SessionStats;
10
11use error::Result;
12use metadata::{MetaExtractor, NoopExtractor};
13use server::Server;
14use session;
15
16/// Builder for `WebSockets` server
17pub struct ServerBuilder<M: core::Metadata, S: core::Middleware<M>> {
18	handler: Arc<core::MetaIoHandler<M, S>>,
19	meta_extractor: Arc<MetaExtractor<M>>,
20	allowed_origins: Option<Vec<Origin>>,
21	allowed_hosts: Option<Vec<Host>>,
22	request_middleware: Option<Arc<session::RequestMiddleware>>,
23	session_stats: Option<Arc<SessionStats>>,
24	executor: UninitializedExecutor,
25	max_connections: usize,
26}
27
28impl<M: core::Metadata + Default, S: core::Middleware<M>> ServerBuilder<M, S> {
29	/// Creates new `ServerBuilder`
30	pub fn new<T>(handler: T) -> Self where
31		T: Into<core::MetaIoHandler<M, S>>,
32	{
33		Self::with_meta_extractor(handler, NoopExtractor)
34	}
35}
36
37impl<M: core::Metadata, S: core::Middleware<M>> ServerBuilder<M, S> {
38	/// Creates new `ServerBuilder`
39	pub fn with_meta_extractor<T, E>(handler: T, extractor: E) -> Self where
40		T: Into<core::MetaIoHandler<M, S>>,
41		E: MetaExtractor<M>,
42	{
43		ServerBuilder {
44			handler: Arc::new(handler.into()),
45			meta_extractor: Arc::new(extractor),
46			allowed_origins: None,
47			allowed_hosts: None,
48			request_middleware: None,
49			session_stats: None,
50			executor: UninitializedExecutor::Unspawned,
51			max_connections: 100,
52		}
53	}
54
55	/// Utilize existing event loop executor to poll RPC results.
56	pub fn event_loop_executor(mut self, executor: server_utils::tokio::runtime::TaskExecutor) -> Self {
57		self.executor = UninitializedExecutor::Shared(executor);
58		self
59	}
60
61	/// Sets a meta extractor.
62	pub fn session_meta_extractor<T: MetaExtractor<M>>(mut self, extractor: T) -> Self {
63		self.meta_extractor = Arc::new(extractor);
64		self
65	}
66
67	/// Allowed origins.
68	pub fn allowed_origins(mut self, allowed_origins: DomainsValidation<Origin>) -> Self {
69		self.allowed_origins = allowed_origins.into();
70		self
71	}
72
73	/// Allowed hosts.
74	pub fn allowed_hosts(mut self, allowed_hosts: DomainsValidation<Host>) -> Self {
75		self.allowed_hosts = allowed_hosts.into();
76		self
77	}
78
79	/// Session stats
80	pub fn session_stats<T: SessionStats>(mut self, stats: T) -> Self {
81		self.session_stats = Some(Arc::new(stats));
82		self
83	}
84
85	/// Sets a request middleware. Middleware will be invoked before each handshake request.
86	/// You can either terminate the handshake in the middleware or run a default behaviour after.
87	pub fn request_middleware<T: session::RequestMiddleware>(mut self, middleware: T) -> Self {
88		self.request_middleware = Some(Arc::new(middleware));
89		self
90	}
91
92	/// Maximal number of concurrent connections this server supports.
93	/// Default: 100
94	pub fn max_connections(mut self, max_connections: usize) -> Self {
95		self.max_connections = max_connections;
96		self
97	}
98
99	/// Starts a new `WebSocket` server in separate thread.
100	/// Returns a `Server` handle which closes the server when droped.
101	pub fn start(self, addr: &SocketAddr) -> Result<Server> {
102		Server::start(
103			addr,
104			self.handler,
105			self.meta_extractor,
106			self.allowed_origins,
107			self.allowed_hosts,
108			self.request_middleware,
109			self.session_stats,
110			self.executor,
111			self.max_connections,
112		)
113	}
114
115}