diff --git a/src/lib.rs b/src/lib.rs index d8e097037..bf668531b 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -338,13 +338,25 @@ where info!("finalized: {}", res); Ok(Some(hexstr_to_hash(res).unwrap())) } + XtStatus::InBlock => { + rpc::send_extrinsic_and_wait_until_in_block(self.url.clone(), jsonreq, result_in); + let res = result_out.recv().unwrap(); + info!("inBlock: {}", res); + Ok(Some(hexstr_to_hash(res).unwrap())) + } + XtStatus::Broadcast => { + rpc::send_extrinsic_and_wait_until_broadcast(self.url.clone(), jsonreq, result_in); + let res = result_out.recv().unwrap(); + info!("broadcast: {}", res); + Ok(None) + } XtStatus::Ready => { rpc::send_extrinsic(self.url.clone(), jsonreq, result_in); let res = result_out.recv().unwrap(); info!("ready: {}", res); Ok(None) } - _ => panic!("can only wait for finalized or ready extrinsic status"), + _ => panic!("can only wait for finalized, in block, broadcast and ready extrinsic status"), } } diff --git a/src/rpc/client.rs b/src/rpc/client.rs index 38f8f9207..557f2f7eb 100644 --- a/src/rpc/client.rs +++ b/src/rpc/client.rs @@ -22,6 +22,8 @@ use ws::{CloseCode, Handler, Handshake, Message, Result, Sender}; #[derive(Debug, PartialEq)] pub enum XtStatus { Finalized, + InBlock, + Broadcast, Ready, Future, Error, @@ -104,6 +106,40 @@ pub fn on_extrinsic_msg_until_finalized( Ok(()) } +pub fn on_extrinsic_msg_until_in_block( + msg: Message, + out: Sender, + result: ThreadOut, +) -> Result<()> { + let retstr = msg.as_text().unwrap(); + debug!("got msg {}", retstr); + match parse_status(retstr) { + (XtStatus::Finalized, val) => end_process(out, result, val), + (XtStatus::InBlock, val) => end_process(out, result, val), + (XtStatus::Future, _) => end_process(out, result, None), + (XtStatus::Error, _) => end_process(out, result, None), + _ => (), + }; + Ok(()) +} + +pub fn on_extrinsic_msg_until_broadcast( + msg: Message, + out: Sender, + result: ThreadOut, +) -> Result<()> { + let retstr = msg.as_text().unwrap(); + debug!("got msg {}", retstr); + match parse_status(retstr) { + (XtStatus::Finalized, val) => end_process(out, result, val), + (XtStatus::Broadcast, _) => end_process(out, result, None), + (XtStatus::Future, _) => end_process(out, result, None), + (XtStatus::Error, _) => end_process(out, result, None), + _ => (), + }; + Ok(()) +} + pub fn on_extrinsic_msg_until_ready( msg: Message, out: Sender, @@ -144,6 +180,12 @@ fn parse_status(msg: &str) -> (XtStatus, Option) { if let Some(hash) = obj.get("finalized") { info!("finalized: {:?}", hash); (XtStatus::Finalized, Some(hash.to_string())) + } else if let Some(hash) = obj.get("inBlock") { + info!("inBlock: {:?}", hash); + (XtStatus::InBlock, Some(hash.to_string())) + } else if let Some(array) = obj.get("broadcast") { + info!("broadcast: {:?}", array); + (XtStatus::Broadcast, Some(array.to_string())) } else { (XtStatus::Unknown, None) } @@ -170,6 +212,30 @@ mod tests { let msg = "{\"jsonrpc\":\"2.0\",\"method\":\"author_extrinsicUpdate\",\"params\":{\"result\":\"ready\",\"subscription\":7185}}"; assert_eq!(parse_status(msg), (XtStatus::Ready, None)); + let msg = "{\"jsonrpc\":\"2.0\",\"method\":\"author_extrinsicUpdate\",\"params\":{\"result\":{\"broadcast\":[\"QmfSF4VYWNqNf5KYHpDEdY8Rt1nPUgSkMweDkYzhSWirGY\",\"Qmchhx9SRFeNvqjUK4ZVQ9jH4zhARFkutf9KhbbAmZWBLx\",\"QmQJAqr98EF1X3YfjVKNwQUG9RryqX4Hv33RqGChbz3Ncg\"]},\"subscription\":232}}"; + assert_eq!( + parse_status(msg), + ( + XtStatus::Broadcast, + Some( + "[\"QmfSF4VYWNqNf5KYHpDEdY8Rt1nPUgSkMweDkYzhSWirGY\",\"Qmchhx9SRFeNvqjUK4ZVQ9jH4zhARFkutf9KhbbAmZWBLx\",\"QmQJAqr98EF1X3YfjVKNwQUG9RryqX4Hv33RqGChbz3Ncg\"]" + .to_string() + ) + ) + ); + + let msg = "{\"jsonrpc\":\"2.0\",\"method\":\"author_extrinsicUpdate\",\"params\":{\"result\":{\"inBlock\":\"0x3104d362365ff5ddb61845e1de441b56c6722e94c1aee362f8aa8ba75bd7a3aa\"},\"subscription\":232}}"; + assert_eq!( + parse_status(msg), + ( + XtStatus::InBlock, + Some( + "\"0x3104d362365ff5ddb61845e1de441b56c6722e94c1aee362f8aa8ba75bd7a3aa\"" + .to_string() + ) + ) + ); + let msg = "{\"jsonrpc\":\"2.0\",\"method\":\"author_extrinsicUpdate\",\"params\":{\"result\":{\"finalized\":\"0x934385b11c483498e2b5bca64c2e8ef76ad6c74d3372a05595d3a50caf758d52\"},\"subscription\":7185}}"; assert_eq!( parse_status(msg), diff --git a/src/rpc/mod.rs b/src/rpc/mod.rs index bd9a72e54..1c054cb28 100644 --- a/src/rpc/mod.rs +++ b/src/rpc/mod.rs @@ -34,6 +34,14 @@ pub fn send_extrinsic(url: String, json_req: String, result_in: ThreadOut) { + start_rpc_client_thread(url, json_req, result_in, on_extrinsic_msg_until_broadcast) +} + +pub fn send_extrinsic_and_wait_until_in_block(url: String, json_req: String, result_in: ThreadOut) { + start_rpc_client_thread(url, json_req, result_in, on_extrinsic_msg_until_in_block) +} + pub fn send_extrinsic_and_wait_until_finalized( url: String, json_req: String,