use Dispatcher when starting RPCs

This commit is contained in:
Robert Habermeier 2017-02-08 20:44:40 +01:00
parent 028dbe5fe2
commit 49f49194c5
4 changed files with 25 additions and 7 deletions

View File

@ -28,6 +28,7 @@ use ethcore::miner::{Miner, ExternalMiner};
use ethcore::snapshot::SnapshotService; use ethcore::snapshot::SnapshotService;
use ethcore_rpc::{Metadata, NetworkSettings}; use ethcore_rpc::{Metadata, NetworkSettings};
use ethcore_rpc::informant::{Middleware, RpcStats, ClientNotifier}; use ethcore_rpc::informant::{Middleware, RpcStats, ClientNotifier};
use ethcore_rpc::dispatch::FullDispatcher;
use ethsync::{ManageNetwork, SyncProvider}; use ethsync::{ManageNetwork, SyncProvider};
use hash_fetch::fetch::Client as FetchClient; use hash_fetch::fetch::Client as FetchClient;
use jsonrpc_core::{MetaIoHandler}; use jsonrpc_core::{MetaIoHandler};
@ -176,10 +177,11 @@ macro_rules! add_signing_methods {
{ {
let handler = &mut $handler; let handler = &mut $handler;
let deps = &$deps; let deps = &$deps;
let dispatcher = FullDispatcher::new(Arc::downgrade(&deps.client), Arc::downgrade(&deps.miner));
if deps.signer_service.is_enabled() { if deps.signer_service.is_enabled() {
handler.extend_with($namespace::to_delegate(SigningQueueClient::new(&deps.signer_service, &deps.client, &deps.miner, &deps.secret_store))) handler.extend_with($namespace::to_delegate(SigningQueueClient::new(&deps.signer_service, dispatcher, &deps.secret_store)))
} else { } else {
handler.extend_with($namespace::to_delegate(SigningUnsafeClient::new(&deps.client, &deps.secret_store, &deps.miner))) handler.extend_with($namespace::to_delegate(SigningUnsafeClient::new(&deps.secret_store, dispatcher)))
} }
} }
} }
@ -194,6 +196,8 @@ pub fn setup_rpc(stats: Arc<RpcStats>, deps: Arc<Dependencies>, apis: ApiSet) ->
// it's turned into vector, cause ont of the cases requires &[] // it's turned into vector, cause ont of the cases requires &[]
let apis = apis.list_apis().into_iter().collect::<Vec<_>>(); let apis = apis.list_apis().into_iter().collect::<Vec<_>>();
let dispatcher = FullDispatcher::new(Arc::downgrade(&deps.client), Arc::downgrade(&deps.miner));
for api in &apis { for api in &apis {
match *api { match *api {
Api::Web3 => { Api::Web3 => {
@ -223,10 +227,10 @@ pub fn setup_rpc(stats: Arc<RpcStats>, deps: Arc<Dependencies>, apis: ApiSet) ->
add_signing_methods!(EthSigning, handler, deps); add_signing_methods!(EthSigning, handler, deps);
}, },
Api::Personal => { Api::Personal => {
handler.extend_with(PersonalClient::new(&deps.secret_store, &deps.client, &deps.miner, deps.geth_compatibility).to_delegate()); handler.extend_with(PersonalClient::new(&deps.secret_store, dispatcher.clone(), deps.geth_compatibility).to_delegate());
}, },
Api::Signer => { Api::Signer => {
handler.extend_with(SignerClient::new(&deps.secret_store, &deps.client, &deps.miner, &deps.signer_service).to_delegate()); handler.extend_with(SignerClient::new(&deps.secret_store, dispatcher.clone(), &deps.signer_service).to_delegate());
}, },
Api::Parity => { Api::Parity => {
let signer = match deps.signer_service.is_enabled() { let signer = match deps.signer_service.is_enabled() {

View File

@ -65,7 +65,7 @@ use jsonrpc_core::reactor::RpcHandler;
pub use ipc::{Server as IpcServer, Error as IpcServerError}; pub use ipc::{Server as IpcServer, Error as IpcServerError};
pub use jsonrpc_http_server::{ServerBuilder, Server, RpcServerError}; pub use jsonrpc_http_server::{ServerBuilder, Server, RpcServerError};
pub mod v1; pub mod v1;
pub use v1::{SigningQueue, SignerService, ConfirmationsQueue, NetworkSettings, Metadata, Origin, informant}; pub use v1::{SigningQueue, SignerService, ConfirmationsQueue, NetworkSettings, Metadata, Origin, informant, dispatch};
pub use v1::block_import::is_major_importing; pub use v1::block_import::is_major_importing;
/// Start http server asynchronously and returns result with `Server` handle on success or an error. /// Start http server asynchronously and returns result with `Server` handle on success or an error.

View File

@ -14,6 +14,8 @@
// You should have received a copy of the GNU General Public License // You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>. // along with Parity. If not, see <http://www.gnu.org/licenses/>.
//! Utilities and helpers for transaction dispatch.
use std::fmt::Debug; use std::fmt::Debug;
use std::ops::Deref; use std::ops::Deref;
use std::sync::Weak; use std::sync::Weak;
@ -152,20 +154,29 @@ impl<C: MiningBlockChainClient, M: MinerService> Dispatcher for FullDispatcher<C
} }
} }
/// default MAC to use.
pub const DEFAULT_MAC: [u8; 2] = [0, 0]; pub const DEFAULT_MAC: [u8; 2] = [0, 0];
type AccountToken = String; /// Single-use account token.
pub type AccountToken = String;
/// Values used to unlock accounts for signing.
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
pub enum SignWith { pub enum SignWith {
/// Nothing -- implies the account is already unlocked.
Nothing, Nothing,
/// Unlock with password.
Password(String), Password(String),
/// Unlock with single-use token.
Token(AccountToken), Token(AccountToken),
} }
/// A value, potentially accompanied by a signing token.
#[derive(Debug)] #[derive(Debug)]
pub enum WithToken<T: Debug> { pub enum WithToken<T: Debug> {
/// No token.
No(T), No(T),
/// With token.
Yes(T, AccountToken), Yes(T, AccountToken),
} }
@ -181,6 +192,7 @@ impl<T: Debug> Deref for WithToken<T> {
} }
impl<T: Debug> WithToken<T> { impl<T: Debug> WithToken<T> {
/// Map the value with the given closure, preserving the token.
pub fn map<S, F>(self, f: F) -> WithToken<S> where pub fn map<S, F>(self, f: F) -> WithToken<S> where
S: Debug, S: Debug,
F: FnOnce(T) -> S, F: FnOnce(T) -> S,
@ -191,6 +203,7 @@ impl<T: Debug> WithToken<T> {
} }
} }
/// Convert into inner value, ignoring possible token.
pub fn into_value(self) -> T { pub fn into_value(self) -> T {
match self { match self {
WithToken::No(v) => v, WithToken::No(v) => v,
@ -222,6 +235,7 @@ impl<T: Debug> From<(T, Option<AccountToken>)> for WithToken<T> {
} }
} }
/// Execute a confirmation payload.
pub fn execute<D: Dispatcher + 'static>( pub fn execute<D: Dispatcher + 'static>(
dispatcher: D, dispatcher: D,
accounts: &AccountProvider, accounts: &AccountProvider,

View File

@ -38,5 +38,5 @@ pub mod types;
pub use self::traits::{Web3, Eth, EthFilter, EthSigning, Net, Parity, ParityAccounts, ParitySet, ParitySigning, Signer, Personal, Traces, Rpc}; pub use self::traits::{Web3, Eth, EthFilter, EthSigning, Net, Parity, ParityAccounts, ParitySet, ParitySigning, Signer, Personal, Traces, Rpc};
pub use self::impls::*; pub use self::impls::*;
pub use self::helpers::{SigningQueue, SignerService, ConfirmationsQueue, NetworkSettings, block_import, informant}; pub use self::helpers::{SigningQueue, SignerService, ConfirmationsQueue, NetworkSettings, block_import, informant, dispatch};
pub use self::metadata::{Metadata, Origin}; pub use self::metadata::{Metadata, Origin};