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

@@ -30,21 +30,23 @@
//!
//! ```
//! extern crate jsonrpc_core;
//! extern crate jsonrpc_server_utils;
//! extern crate ethcore_signer;
//! extern crate ethcore_rpc;
//!
//! use std::sync::Arc;
//! use jsonrpc_core::IoHandler;
//! use jsonrpc_core::reactor::RpcEventLoop;
//! use jsonrpc_server_utils::reactor::RpcEventLoop;
//! use ethcore_signer::ServerBuilder;
//! use ethcore_rpc::ConfirmationsQueue;
//!
//! fn main() {
//! let queue = Arc::new(ConfirmationsQueue::default());
//! let io = Arc::new(IoHandler::new().into());
//! let event_loop = RpcEventLoop::spawn();
//! let io = IoHandler::default();
//! let event_loop = RpcEventLoop::spawn().unwrap();
//! let remote = event_loop.remote();
//! let _server = ServerBuilder::new(queue, "/tmp/authcodes".into())
//! .start("127.0.0.1:8084".parse().unwrap(), event_loop.handler(io));
//! .start("127.0.0.1:8084".parse().unwrap(), io, remote);
//! }
//! ```
@@ -57,6 +59,7 @@ extern crate ethcore_util as util;
extern crate ethcore_rpc as rpc;
extern crate ethcore_io as io;
extern crate jsonrpc_core;
extern crate jsonrpc_server_utils;
extern crate ws;
extern crate ethcore_devtools as devtools;

View File

@@ -22,7 +22,7 @@ use devtools::RandomTempPath;
use rpc::ConfirmationsQueue;
use jsonrpc_core::IoHandler;
use jsonrpc_core::reactor::RpcEventLoop;
use jsonrpc_server_utils::reactor::RpcEventLoop;
use rand;
use ServerBuilder;
@@ -70,9 +70,10 @@ pub fn serve() -> (ServerLoop, usize, GuardedAuthCodes) {
let queue = Arc::new(ConfirmationsQueue::default());
let builder = ServerBuilder::new(queue, path.to_path_buf());
let port = 35000 + rand::random::<usize>() % 10000;
let event_loop = RpcEventLoop::spawn();
let handler = event_loop.handler(Arc::new(IoHandler::default().into()));
let server = builder.start(format!("127.0.0.1:{}", port).parse().unwrap(), handler).unwrap();
let event_loop = RpcEventLoop::spawn().unwrap();
let io = IoHandler::default();
let remote = event_loop.remote();
let server = builder.start(format!("127.0.0.1:{}", port).parse().unwrap(), io, remote).unwrap();
let res = ServerLoop {
server: server,
event_loop: event_loop,

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,