Dapps interface RPC (#3311)
* Dapps Interface RPC * Adding JS apis * Support for signer interface in proxypac and embeds * Fixing tests * fixing tests again
This commit is contained in:
committed by
Arkadiy Paronyan
parent
eba0dd5023
commit
88c9cea04d
@@ -22,18 +22,18 @@ use v1::helpers::signing_queue::{ConfirmationsQueue};
|
||||
pub struct SignerService {
|
||||
queue: Arc<ConfirmationsQueue>,
|
||||
generate_new_token: Box<Fn() -> Result<String, String> + Send + Sync + 'static>,
|
||||
port: Option<u16>,
|
||||
address: Option<(String, u16)>,
|
||||
}
|
||||
|
||||
impl SignerService {
|
||||
|
||||
/// Creates new Signer Service given function to generate new tokens.
|
||||
pub fn new<F>(new_token: F, port: Option<u16>) -> Self
|
||||
pub fn new<F>(new_token: F, address: Option<(String, u16)>) -> Self
|
||||
where F: Fn() -> Result<String, String> + Send + Sync + 'static {
|
||||
SignerService {
|
||||
queue: Arc::new(ConfirmationsQueue::default()),
|
||||
generate_new_token: Box::new(new_token),
|
||||
port: port,
|
||||
address: address,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,20 +47,20 @@ impl SignerService {
|
||||
self.queue.clone()
|
||||
}
|
||||
|
||||
/// Returns signer port (if signer enabled) or `None` otherwise
|
||||
pub fn port(&self) -> Option<u16> {
|
||||
self.port
|
||||
/// Returns signer address (if signer enabled) or `None` otherwise
|
||||
pub fn address(&self) -> Option<(String, u16)> {
|
||||
self.address.clone()
|
||||
}
|
||||
|
||||
/// Returns true if Signer is enabled.
|
||||
pub fn is_enabled(&self) -> bool {
|
||||
self.port.is_some()
|
||||
self.address.is_some()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
/// Creates new Signer Service for tests.
|
||||
pub fn new_test(port: Option<u16>) -> Self {
|
||||
SignerService::new(|| Ok("new_token".into()), port)
|
||||
pub fn new_test(address: Option<(String, u16)>) -> Self {
|
||||
SignerService::new(|| Ok("new_token".into()), address)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@ pub struct ParityClient<C, M, S: ?Sized> where
|
||||
logger: Arc<RotatingLogger>,
|
||||
settings: Arc<NetworkSettings>,
|
||||
signer: Option<Arc<SignerService>>,
|
||||
dapps_interface: Option<String>,
|
||||
dapps_port: Option<u16>,
|
||||
}
|
||||
|
||||
@@ -70,6 +71,7 @@ impl<C, M, S: ?Sized> ParityClient<C, M, S> where
|
||||
logger: Arc<RotatingLogger>,
|
||||
settings: Arc<NetworkSettings>,
|
||||
signer: Option<Arc<SignerService>>,
|
||||
dapps_interface: Option<String>,
|
||||
dapps_port: Option<u16>,
|
||||
) -> Self {
|
||||
ParityClient {
|
||||
@@ -81,6 +83,7 @@ impl<C, M, S: ?Sized> ParityClient<C, M, S> where
|
||||
logger: logger,
|
||||
settings: settings,
|
||||
signer: signer,
|
||||
dapps_interface: dapps_interface,
|
||||
dapps_port: dapps_port,
|
||||
}
|
||||
}
|
||||
@@ -261,7 +264,8 @@ impl<C, M, S: ?Sized> Parity for ParityClient<C, M, S> where
|
||||
|
||||
self.signer
|
||||
.clone()
|
||||
.and_then(|signer| signer.port())
|
||||
.and_then(|signer| signer.address())
|
||||
.map(|address| address.1)
|
||||
.ok_or_else(|| errors::signer_disabled())
|
||||
}
|
||||
|
||||
@@ -272,6 +276,13 @@ impl<C, M, S: ?Sized> Parity for ParityClient<C, M, S> where
|
||||
.ok_or_else(|| errors::dapps_disabled())
|
||||
}
|
||||
|
||||
fn dapps_interface(&self) -> Result<String, Error> {
|
||||
try!(self.active());
|
||||
|
||||
self.dapps_interface.clone()
|
||||
.ok_or_else(|| errors::dapps_disabled())
|
||||
}
|
||||
|
||||
fn next_nonce(&self, address: H160) -> Result<U256, Error> {
|
||||
try!(self.active());
|
||||
let address: Address = address.into();
|
||||
|
||||
@@ -38,6 +38,7 @@ pub struct Dependencies {
|
||||
pub settings: Arc<NetworkSettings>,
|
||||
pub network: Arc<ManageNetwork>,
|
||||
pub accounts: Arc<AccountProvider>,
|
||||
pub dapps_interface: Option<String>,
|
||||
pub dapps_port: Option<u16>,
|
||||
}
|
||||
|
||||
@@ -61,6 +62,7 @@ impl Dependencies {
|
||||
}),
|
||||
network: Arc::new(TestManageNetwork),
|
||||
accounts: Arc::new(AccountProvider::transient_provider()),
|
||||
dapps_interface: Some("127.0.0.1".into()),
|
||||
dapps_port: Some(18080),
|
||||
}
|
||||
}
|
||||
@@ -75,6 +77,7 @@ impl Dependencies {
|
||||
self.logger.clone(),
|
||||
self.settings.clone(),
|
||||
signer,
|
||||
self.dapps_interface.clone(),
|
||||
self.dapps_port,
|
||||
)
|
||||
}
|
||||
@@ -238,7 +241,7 @@ fn rpc_parity_node_name() {
|
||||
#[test]
|
||||
fn rpc_parity_unsigned_transactions_count() {
|
||||
let deps = Dependencies::new();
|
||||
let io = deps.with_signer(SignerService::new_test(Some(18180)));
|
||||
let io = deps.with_signer(SignerService::new_test(Some(("127.0.0.1".into(), 18180))));
|
||||
|
||||
let request = r#"{"jsonrpc": "2.0", "method": "parity_unsignedTransactionsCount", "params":[], "id": 1}"#;
|
||||
let response = r#"{"jsonrpc":"2.0","result":0,"id":1}"#;
|
||||
@@ -282,7 +285,7 @@ fn rpc_parity_encrypt() {
|
||||
fn rpc_parity_signer_port() {
|
||||
// given
|
||||
let deps = Dependencies::new();
|
||||
let io1 = deps.with_signer(SignerService::new_test(Some(18180)));
|
||||
let io1 = deps.with_signer(SignerService::new_test(Some(("127.0.0.1".into(), 18180))));
|
||||
let io2 = deps.default_client();
|
||||
|
||||
// when
|
||||
@@ -313,6 +316,24 @@ fn rpc_parity_dapps_port() {
|
||||
assert_eq!(io2.handle_request_sync(request), Some(response2.to_owned()));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rpc_parity_dapps_interface() {
|
||||
// given
|
||||
let mut deps = Dependencies::new();
|
||||
let io1 = deps.default_client();
|
||||
deps.dapps_interface = None;
|
||||
let io2 = deps.default_client();
|
||||
|
||||
// when
|
||||
let request = r#"{"jsonrpc": "2.0", "method": "parity_dappsInterface", "params": [], "id": 1}"#;
|
||||
let response1 = r#"{"jsonrpc":"2.0","result":"127.0.0.1","id":1}"#;
|
||||
let response2 = r#"{"jsonrpc":"2.0","error":{"code":-32031,"message":"Dapps Server is disabled. This API is not available.","data":null},"id":1}"#;
|
||||
|
||||
// then
|
||||
assert_eq!(io1.handle_request_sync(request), Some(response1.to_owned()));
|
||||
assert_eq!(io2.handle_request_sync(request), Some(response2.to_owned()));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rpc_parity_next_nonce() {
|
||||
let deps = Dependencies::new();
|
||||
|
||||
@@ -123,6 +123,10 @@ build_rpc_trait! {
|
||||
#[rpc(name = "parity_dappsPort")]
|
||||
fn dapps_port(&self) -> Result<u16, Error>;
|
||||
|
||||
/// Returns current Dapps Server interface address or an error if dapps server is disabled.
|
||||
#[rpc(name = "parity_dappsInterface")]
|
||||
fn dapps_interface(&self) -> Result<String, Error>;
|
||||
|
||||
/// Returns next nonce for particular sender. Should include all transactions in the queue.
|
||||
#[rpc(name = "parity_nextNonce")]
|
||||
fn next_nonce(&self, H160) -> Result<U256, Error>;
|
||||
|
||||
Reference in New Issue
Block a user