Rebased on master

This commit is contained in:
Kristoffer Ström 2016-11-02 17:14:05 +01:00 committed by arkpar
parent 6552319074
commit 0e516162c3
6 changed files with 142 additions and 38 deletions

78
Cargo.lock generated
View File

@ -31,9 +31,11 @@ dependencies = [
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
"num_cpus 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
"number_prefix 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "number_prefix 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
"parity-rpc-client 1.4.0",
"regex 0.1.68 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.1.68 (registry+https://github.com/rust-lang/crates.io-index)",
"rlp 0.1.0", "rlp 0.1.0",
"rpassword 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rpassword 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"rpc-cli 1.4.0",
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
"semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
@ -711,6 +713,14 @@ dependencies = [
"miniz-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "miniz-sys 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]]
name = "futures"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]] [[package]]
name = "gcc" name = "gcc"
version = "0.3.35" version = "0.3.35"
@ -1254,6 +1264,26 @@ dependencies = [
"syntex_syntax 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "syntex_syntax 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]]
name = "parity-rpc-client"
version = "1.4.0"
dependencies = [
"ethcore-rpc 1.5.0",
"ethcore-signer 1.5.0",
"ethcore-util 1.5.0",
"futures 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"jsonrpc-core 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
"matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
"tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
"url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"ws 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]] [[package]]
name = "parity-ui" name = "parity-ui"
version = "1.5.0" version = "1.5.0"
@ -1533,6 +1563,29 @@ dependencies = [
"winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]]
name = "rpassword"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)",
"termios 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rpc-cli"
version = "1.4.0"
dependencies = [
"ethcore-bigint 0.1.2",
"ethcore-rpc 1.5.0",
"ethcore-util 1.5.0",
"futures 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"parity-rpc-client 1.4.0",
"rpassword 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]] [[package]]
name = "rust-crypto" name = "rust-crypto"
version = "0.2.36" version = "0.2.36"
@ -1763,6 +1816,14 @@ name = "target_info"
version = "0.1.0" version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "tempdir"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]] [[package]]
name = "term" name = "term"
version = "0.2.14" version = "0.2.14"
@ -1963,6 +2024,19 @@ dependencies = [
"url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]]
name = "ws"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"httparse 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
"mio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
"sha1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"url 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]] [[package]]
name = "ws2_32-sys" name = "ws2_32-sys"
version = "0.2.1" version = "0.2.1"
@ -2032,6 +2106,7 @@ dependencies = [
"checksum ethabi 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0c53453517f620847be51943db329276ae52f2e210cfc659e81182864be2f" "checksum ethabi 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0c53453517f620847be51943db329276ae52f2e210cfc659e81182864be2f"
"checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" "checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa"
"checksum flate2 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "3eeb481e957304178d2e782f2da1257f1434dfecbae883bafb61ada2a9fea3bb" "checksum flate2 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "3eeb481e957304178d2e782f2da1257f1434dfecbae883bafb61ada2a9fea3bb"
"checksum futures 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dd89497091f8c5d3a65c6b4baf6d2f0731937a7c9217d2f89141b21437a9d96"
"checksum gcc 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "91ecd03771effb0c968fd6950b37e89476a578aaf1c70297d8e92b6516ec3312" "checksum gcc 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "91ecd03771effb0c968fd6950b37e89476a578aaf1c70297d8e92b6516ec3312"
"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
"checksum hamming 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65043da274378d68241eb9a8f8f8aa54e349136f7b8e12f63e3ef44043cc30e1" "checksum hamming 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65043da274378d68241eb9a8f8f8aa54e349136f7b8e12f63e3ef44043cc30e1"
@ -2118,6 +2193,7 @@ dependencies = [
"checksum rocksdb-sys 0.3.0 (git+https://github.com/ethcore/rust-rocksdb)" = "<none>" "checksum rocksdb-sys 0.3.0 (git+https://github.com/ethcore/rust-rocksdb)" = "<none>"
"checksum rotor 0.6.3 (git+https://github.com/ethcore/rotor)" = "<none>" "checksum rotor 0.6.3 (git+https://github.com/ethcore/rotor)" = "<none>"
"checksum rpassword 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5d3a99497c5c544e629cc8b359ae5ede321eba5fa8e5a8078f3ced727a976c3f" "checksum rpassword 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5d3a99497c5c544e629cc8b359ae5ede321eba5fa8e5a8078f3ced727a976c3f"
"checksum rpassword 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ab6e42be826e215f30ff830904f8f4a0933c6e2ae890e1af8b408f5bae60081e"
"checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" "checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a"
"checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b" "checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b"
"checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084" "checksum rustc_version 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "c5f5376ea5e30ce23c03eb77cbe4962b988deead10910c372b226388b594c084"
@ -2146,6 +2222,7 @@ dependencies = [
"checksum syntex_syntax 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44bded3cabafc65c90b663b1071bd2d198a9ab7515e6ce729e4570aaf53c407e" "checksum syntex_syntax 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44bded3cabafc65c90b663b1071bd2d198a9ab7515e6ce729e4570aaf53c407e"
"checksum syntex_syntax 0.42.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7628a0506e8f9666fdabb5f265d0059b059edac9a3f810bda077abb5d826bd8d" "checksum syntex_syntax 0.42.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7628a0506e8f9666fdabb5f265d0059b059edac9a3f810bda077abb5d826bd8d"
"checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe" "checksum target_info 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c63f48baada5c52e65a29eef93ab4f8982681b67f9e8d29c7b05abcfec2b9ffe"
"checksum tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6"
"checksum term 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "f2077e54d38055cf1ca0fd7933a2e00cd3ec8f6fed352b2a377f06dcdaaf3281" "checksum term 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "f2077e54d38055cf1ca0fd7933a2e00cd3ec8f6fed352b2a377f06dcdaaf3281"
"checksum term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3deff8a2b3b6607d6d7cc32ac25c0b33709453ca9cceac006caac51e963cf94a" "checksum term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3deff8a2b3b6607d6d7cc32ac25c0b33709453ca9cceac006caac51e963cf94a"
"checksum termios 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d9cf598a6d7ce700a4e6a9199da127e6819a61e64b68609683cc9a01b5683a" "checksum termios 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d9cf598a6d7ce700a4e6a9199da127e6819a61e64b68609683cc9a01b5683a"
@ -2172,6 +2249,7 @@ dependencies = [
"checksum winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4dfaaa8fbdaa618fa6914b59b2769d690dd7521920a18d84b42d254678dd5fd4" "checksum winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4dfaaa8fbdaa618fa6914b59b2769d690dd7521920a18d84b42d254678dd5fd4"
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
"checksum ws 0.5.3 (git+https://github.com/ethcore/ws-rs.git?branch=mio-upstream-stable)" = "<none>" "checksum ws 0.5.3 (git+https://github.com/ethcore/ws-rs.git?branch=mio-upstream-stable)" = "<none>"
"checksum ws 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7c47e9ca2f5c47d27f731b1bb9bb50cc05f9886bb84fbd52afa0ff97f4f61b06"
"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
"checksum xml-rs 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "65e74b96bd3179209dc70a980da6df843dff09e46eee103a0376c0949257e3ef" "checksum xml-rs 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "65e74b96bd3179209dc70a980da6df843dff09e46eee103a0376c0949257e3ef"
"checksum xmltree 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "472a9d37c7c53ab2391161df5b89b1f3bf76dab6ab150d7941ecbdd832282082" "checksum xmltree 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "472a9d37c7c53ab2391161df5b89b1f3bf76dab6ab150d7941ecbdd832282082"

View File

@ -47,6 +47,8 @@ rlp = { path = "util/rlp" }
ethcore-stratum = { path = "stratum" } ethcore-stratum = { path = "stratum" }
ethcore-dapps = { path = "dapps", optional = true } ethcore-dapps = { path = "dapps", optional = true }
clippy = { version = "0.0.103", optional = true} clippy = { version = "0.0.103", optional = true}
rpc-cli = { path = "rpc_cli" }
parity-rpc-client = { path = "rpc_client" }
[target.'cfg(windows)'.dependencies] [target.'cfg(windows)'.dependencies]
winapi = "0.2" winapi = "0.2"

View File

@ -120,16 +120,12 @@ impl Configuration {
let cmd = if self.args.flag_version { let cmd = if self.args.flag_version {
Cmd::Version Cmd::Version
<<<<<<< HEAD
} else if self.args.cmd_signer && self.args.cmd_new_token {
Cmd::SignerToken(signer_conf)
=======
} else if self.args.cmd_signer { } else if self.args.cmd_signer {
let mut authfile = PathBuf::from(signer_conf.signer_path); let mut authfile = PathBuf::from(signer_conf.signer_path.clone());
authfile.push(AUTHCODE_FILENAME); authfile.push(AUTHCODE_FILENAME);
if self.args.cmd_new_token { if self.args.cmd_new_token {
Cmd::SignerToken(dirs.signer) Cmd::SignerToken(signer_conf)
} else if self.args.cmd_sign { } else if self.args.cmd_sign {
let pwfile = self.args.flag_password.get(0).map(|pwfile| { let pwfile = self.args.flag_password.get(0).map(|pwfile| {
PathBuf::from(pwfile) PathBuf::from(pwfile)
@ -154,7 +150,6 @@ impl Configuration {
} else { } else {
unreachable!(); unreachable!();
} }
>>>>>>> Add Ws Json rpc client and command line utils
} else if self.args.cmd_tools && self.args.cmd_hash { } else if self.args.cmd_tools && self.args.cmd_hash {
Cmd::Hash(self.args.arg_file) Cmd::Hash(self.args.arg_file)
} else if self.args.cmd_account { } else if self.args.cmd_account {

View File

@ -48,10 +48,11 @@ impl fmt::Display for ConfirmationRequest {
impl fmt::Display for ConfirmationPayload { impl fmt::Display for ConfirmationPayload {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self { match *self {
ConfirmationPayload::Transaction(ref transaction) ConfirmationPayload::SendTransaction(ref transaction)
=> write!(f, "{}", transaction), => write!(f, "{}", transaction),
ConfirmationPayload::Sign(_) => write!(f, "TODO: data"), ConfirmationPayload::SignTransaction(_) => write!(f, "TODO: data"),
ConfirmationPayload::Decrypt(_) => write!(f, "TODO: decrypt"), ConfirmationPayload::Decrypt(_) => write!(f, "TODO: decrypt"),
ConfirmationPayload::Signature(_) => write!(f, "TODO: signature"),
} }
} }
} }

View File

@ -18,8 +18,8 @@ use futures::Future;
fn sign_interactive( fn sign_interactive(
signer: &mut SignerRpc, signer: &mut SignerRpc,
password: &str, password: &str,
request: ConfirmationRequest) request: ConfirmationRequest
{ ) {
print!("\n{}\nSign this transaction? (y)es/(N)o/(r)eject: ", request); print!("\n{}\nSign this transaction? (y)es/(N)o/(r)eject: ", request);
let _ = stdout().flush(); let _ = stdout().flush();
match BufReader::new(stdin()).lines().next() { match BufReader::new(stdin()).lines().next() {
@ -43,7 +43,8 @@ fn sign_interactive(
} }
fn sign_transactions( fn sign_transactions(
signer: &mut SignerRpc, password: String signer: &mut SignerRpc,
password: String
) -> Result<String, String> { ) -> Result<String, String> {
try!(signer.requests_to_confirm().map(|reqs| { try!(signer.requests_to_confirm().map(|reqs| {
match reqs { match reqs {
@ -120,8 +121,7 @@ pub fn cmd_signer_list(
signerport: u16, authfile: PathBuf signerport: u16, authfile: PathBuf
) -> Result<String, String> { ) -> Result<String, String> {
let addr = &format!("ws://127.0.0.1:{}", signerport); let addr = &format!("ws://127.0.0.1:{}", signerport);
let mut signer = try!(SignerRpc::new(addr, &authfile)); let mut signer = try!(SignerRpc::new(addr, &authfile).map_err(|err| {
signer.map_err(|err| {
format!("{:?}", err) format!("{:?}", err)
})); }));
list_transactions(&mut signer) list_transactions(&mut signer)
@ -154,7 +154,8 @@ pub fn cmd_signer_sign(
_ => return Err(format!("No password in file")) _ => return Err(format!("No password in file"))
} }
}, },
Err(e) => return Err(format!("Could not open password file: {}", e)) Err(e) =>
return Err(format!("Could not open password file: {}", e))
} }
} }
None => { None => {
@ -165,7 +166,8 @@ pub fn cmd_signer_sign(
} }
} }
let mut signer = try!(SignerRpc::new(&format!("ws://127.0.0.1:{}", signerport), &authfile).map_err(|err| { let addr = &format!("ws://127.0.0.1:{}", signerport);
let mut signer = try!(SignerRpc::new(addr, &authfile).map_err(|err| {
format!("{:?}", err) format!("{:?}", err)
})); }));

View File

@ -13,15 +13,17 @@ use util::{Hashable, Mutex};
use url::Url; use url::Url;
use std::fs::File; use std::fs::File;
use ws::{self, use ws::{
Request, self,
Handler, Request,
Sender, Handler,
Handshake, Sender,
Error as WsError, Handshake,
ErrorKind as WsErrorKind, Error as WsError,
Message, ErrorKind as WsErrorKind,
Result as WsResult}; Message,
Result as WsResult
};
use serde::Deserialize; use serde::Deserialize;
use serde_json::{self as json, use serde_json::{self as json,
@ -73,7 +75,8 @@ impl Handler for RpcHandler {
r.add_protocol(&proto); r.add_protocol(&proto);
Ok(r) Ok(r)
}, },
Err(e) => Err(WsError::new(WsErrorKind::Internal, format!("{}", e))), Err(e) =>
Err(WsError::new(WsErrorKind::Internal, format!("{}", e))),
} }
} }
fn on_error(&mut self, err: WsError) { fn on_error(&mut self, err: WsError) {
@ -93,7 +96,8 @@ impl Handler for RpcHandler {
Ok(()) Ok(())
}, },
_ => { _ => {
Err(WsError::new(WsErrorKind::Internal, format!("on_open called twice"))) let msg = format!("on_open called twice");
Err(WsError::new(WsErrorKind::Internal, msg))
} }
} }
} }
@ -102,7 +106,8 @@ impl Handler for RpcHandler {
let response_id; let response_id;
let string = &msg.to_string(); let string = &msg.to_string();
match json::from_str::<SyncOutput>(&string) { match json::from_str::<SyncOutput>(&string) {
Ok(SyncOutput::Success(Success { result, id: Id::Num(id), .. })) => { Ok(SyncOutput::Success(Success { result, id: Id::Num(id), .. })) =>
{
ret = Ok(result); ret = Ok(result);
response_id = id as usize; response_id = id as usize;
} }
@ -111,11 +116,20 @@ impl Handler for RpcHandler {
response_id = id as usize; response_id = id as usize;
} }
Err(e) => { Err(e) => {
warn!(target: "rpc-client", "recieved invalid message: {}\n {:?}", string, e); warn!(
target: "rpc-client",
"recieved invalid message: {}\n {:?}",
string,
e
);
return Ok(()) return Ok(())
}, },
_ => { _ => {
warn!(target: "rpc-client", "recieved invalid message: {}", string); warn!(
target: "rpc-client",
"recieved invalid message: {}",
string
);
return Ok(()) return Ok(())
} }
} }
@ -124,7 +138,11 @@ impl Handler for RpcHandler {
Some(c) => c.complete(ret.map_err(|err| { Some(c) => c.complete(ret.map_err(|err| {
RpcError::JsonRpc(err) RpcError::JsonRpc(err)
})), })),
None => warn!(target: "rpc-client", "warning: unexpected id: {}", response_id), None => warn!(
target: "rpc-client",
"warning: unexpected id: {}",
response_id
),
} }
Ok(()) Ok(())
} }
@ -132,7 +150,9 @@ impl Handler for RpcHandler {
/// Keeping track of issued requests to be matched up with responses /// Keeping track of issued requests to be matched up with responses
#[derive(Clone)] #[derive(Clone)]
struct Pending(Arc<Mutex<BTreeMap<usize, Complete<Result<JsonValue, RpcError>>>>>); struct Pending(
Arc<Mutex<BTreeMap<usize, Complete<Result<JsonValue, RpcError>>>>>
);
impl Pending { impl Pending {
fn new() -> Self { fn new() -> Self {
@ -141,7 +161,10 @@ impl Pending {
fn insert(&mut self, k: usize, v: Complete<Result<JsonValue, RpcError>>) { fn insert(&mut self, k: usize, v: Complete<Result<JsonValue, RpcError>>) {
self.0.lock().insert(k, v); self.0.lock().insert(k, v);
} }
fn remove(&mut self, k: usize) -> Option<Complete<Result<JsonValue, RpcError>>> { fn remove(
&mut self,
k: usize
) -> Option<Complete<Result<JsonValue, RpcError>>> {
self.0.lock().remove(&k) self.0.lock().remove(&k)
} }
} }
@ -178,22 +201,24 @@ impl Rpc {
Err(e) => return done(Ok(Err(e))).boxed(), Err(e) => return done(Ok(Err(e))).boxed(),
Ok(code) => { Ok(code) => {
let url = String::from(url); let url = String::from(url);
// The ws::connect takes a FnMut closure, which means c cannot be // The ws::connect takes a FnMut closure, which means c cannot
// moved into it, since it's consumed on complete. // be moved into it, since it's consumed on complete.
// Therefore we wrap it in an option and pick it out once. // Therefore we wrap it in an option and pick it out once.
let mut once = Some(c); let mut once = Some(c);
thread::spawn(move || { thread::spawn(move || {
let conn = ws::connect(url, |out| { let conn = ws::connect(url, |out| {
// this will panic if the closure is called twice, // this will panic if the closure is called twice,
// which it should never be. // which it should never be.
let c = once.take().expect("connection closure called only once"); let c = once.take()
.expect("connection closure called only once");
RpcHandler::new(out, code.clone(), c) RpcHandler::new(out, code.clone(), c)
}); });
match conn { match conn {
Err(err) => { Err(err) => {
// since ws::connect is only called once, it cannot // since ws::connect is only called once, it cannot
// both fail and succeed. // both fail and succeed.
let c = once.take().expect("connection closure called only once"); let c = once.take()
.expect("connection closure called only once");
c.complete(Err(RpcError::WsError(err))); c.complete(Err(RpcError::WsError(err)));
}, },
// c will complete on the `on_open` event in the Handler // c will complete on the `on_open` event in the Handler
@ -222,7 +247,8 @@ impl Rpc {
id: Id::Num(id as u64), id: Id::Num(id as u64),
}; };
let serialized = json::to_string(&request).expect("request is serializable"); let serialized = json::to_string(&request)
.expect("request is serializable");
let _ = self.out.send(serialized); let _ = self.out.send(serialized);
p.map(|result| { p.map(|result| {