New version of jsonrpc.

This commit is contained in:
Tomasz Drwięga
2017-03-13 15:49:52 +01:00
parent be87151f1c
commit 8bf5be0cc4
28 changed files with 469 additions and 480 deletions

View File

@@ -26,8 +26,8 @@ use std::thread;
use std;
use io::{PanicHandler, OnPanicListener, MayPanic};
use jsonrpc_core::{Metadata, Middleware};
use jsonrpc_core::reactor::RpcHandler;
use jsonrpc_core::{Metadata, Middleware, MetaIoHandler};
use jsonrpc_server_utils::tokio_core::reactor::Remote;
use rpc::{ConfirmationsQueue};
use rpc::informant::RpcStats;
@@ -92,21 +92,28 @@ impl ServerBuilder {
/// Starts a new `WebSocket` server in separate thread.
/// Returns a `Server` handle which closes the server when droped.
pub fn start<M: Metadata, S: Middleware<M>>(self, addr: SocketAddr, handler: RpcHandler<M, S>) -> Result<Server, ServerError> {
self.start_with_extractor(addr, handler, NoopExtractor)
pub fn start<M: Metadata, S: Middleware<M>, H: Into<MetaIoHandler<M, S>>>(
self,
addr: SocketAddr,
handler: H,
remote: Remote,
) -> Result<Server, ServerError> {
self.start_with_extractor(addr, handler, remote, NoopExtractor)
}
/// Starts a new `WebSocket` server in separate thread.
/// Returns a `Server` handle which closes the server when droped.
pub fn start_with_extractor<M: Metadata, S: Middleware<M>, T: session::MetaExtractor<M>>(
pub fn start_with_extractor<M: Metadata, S: Middleware<M>, H: Into<MetaIoHandler<M, S>>, T: session::MetaExtractor<M>>(
self,
addr: SocketAddr,
handler: RpcHandler<M, S>,
handler: H,
remote: Remote,
meta_extractor: T,
) -> Result<Server, ServerError> {
Server::start(
addr,
handler,
handler.into(),
remote,
self.queue,
self.authcodes_path,
self.skip_origin_validation,
@@ -136,7 +143,8 @@ impl Server {
/// Returns a `Server` handle which closes the server when droped.
fn start<M: Metadata, S: Middleware<M>, T: session::MetaExtractor<M>>(
addr: SocketAddr,
handler: RpcHandler<M, S>,
handler: MetaIoHandler<M, S>,
remote: Remote,
queue: Arc<ConfirmationsQueue>,
authcodes_path: PathBuf,
skip_origin_validation: bool,
@@ -156,7 +164,7 @@ impl Server {
let origin = format!("{}", addr);
let port = addr.port();
let ws = ws::Builder::new().with_settings(config).build(
session::Factory::new(handler, origin, port, authcodes_path, skip_origin_validation, stats, meta_extractor)
session::Factory::new(handler, remote, origin, port, authcodes_path, skip_origin_validation, stats, meta_extractor)
)?;
let panic_handler = PanicHandler::new_in_arc();

View File

@@ -21,8 +21,9 @@ use std::sync::Arc;
use std::str::FromStr;
use authcode_store::AuthCodes;
use jsonrpc_core::{Metadata, Middleware};
use jsonrpc_core::reactor::RpcHandler;
use jsonrpc_core::{Metadata, Middleware, MetaIoHandler};
use jsonrpc_core::futures::Future;
use jsonrpc_server_utils::tokio_core::reactor::Remote;
use rpc::informant::RpcStats;
use util::{H256, version};
use ws;
@@ -145,7 +146,8 @@ pub struct Session<M: Metadata, S: Middleware<M>, T> {
self_origin: String,
self_port: u16,
authcodes_path: PathBuf,
handler: RpcHandler<M, S>,
handler: Arc<MetaIoHandler<M, S>>,
remote: Remote,
file_handler: Arc<ui::Handler>,
stats: Option<Arc<RpcStats>>,
meta_extractor: T,
@@ -237,7 +239,7 @@ impl<M: Metadata, S: Middleware<M>, T: MetaExtractor<M>> ws::Handler for Session
// TODO [ToDr] Move to on_connect
let metadata = self.meta_extractor.extract_metadata(&self.session_id);
self.handler.handle_request(req, metadata, move |response| {
let future = self.handler.handle_request(req, metadata).map(move |response| {
if let Some(result) = response {
let res = out.send(result);
if let Err(e) = res {
@@ -245,12 +247,14 @@ impl<M: Metadata, S: Middleware<M>, T: MetaExtractor<M>> ws::Handler for Session
}
}
});
self.remote.spawn(move |_| future);
Ok(())
}
}
pub struct Factory<M: Metadata, S: Middleware<M>, T> {
handler: RpcHandler<M, S>,
handler: Arc<MetaIoHandler<M, S>>,
remote: Remote,
skip_origin_validation: bool,
self_origin: String,
self_port: u16,
@@ -262,7 +266,8 @@ pub struct Factory<M: Metadata, S: Middleware<M>, T> {
impl<M: Metadata, S: Middleware<M>, T> Factory<M, S, T> {
pub fn new(
handler: RpcHandler<M, S>,
handler: MetaIoHandler<M, S>,
remote: Remote,
self_origin: String,
self_port: u16,
authcodes_path: PathBuf,
@@ -271,7 +276,8 @@ impl<M: Metadata, S: Middleware<M>, T> Factory<M, S, T> {
meta_extractor: T,
) -> Self {
Factory {
handler: handler,
handler: Arc::new(handler),
remote: remote,
skip_origin_validation: skip_origin_validation,
self_origin: self_origin,
self_port: self_port,
@@ -293,6 +299,7 @@ impl<M: Metadata, S: Middleware<M>, T: MetaExtractor<M>> ws::Factory for Factory
session_id: 0.into(),
out: sender,
handler: self.handler.clone(),
remote: self.remote.clone(),
skip_origin_validation: self.skip_origin_validation,
self_origin: self.self_origin.clone(),
self_port: self.self_port,