Skip to content

Commit 129ec67

Browse files
hoanibrenzi
authored andcommitted
Add ability to exit on InBlock and Broadcast status for send_extrinsic
1 parent ed8b6b4 commit 129ec67

File tree

3 files changed

+87
-1
lines changed

3 files changed

+87
-1
lines changed

src/lib.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -360,13 +360,25 @@ where
360360
info!("finalized: {}", res);
361361
Ok(Some(hexstr_to_hash(res).unwrap()))
362362
}
363+
XtStatus::InBlock => {
364+
rpc::send_extrinsic_and_wait_until_in_block(self.url.clone(), jsonreq, result_in);
365+
let res = result_out.recv().unwrap();
366+
info!("inBlock: {}", res);
367+
Ok(Some(hexstr_to_hash(res).unwrap()))
368+
}
369+
XtStatus::Broadcast => {
370+
rpc::send_extrinsic_and_wait_until_broadcast(self.url.clone(), jsonreq, result_in);
371+
let res = result_out.recv().unwrap();
372+
info!("broadcast: {}", res);
373+
Ok(None)
374+
}
363375
XtStatus::Ready => {
364376
rpc::send_extrinsic(self.url.clone(), jsonreq, result_in);
365377
let res = result_out.recv().unwrap();
366378
info!("ready: {}", res);
367379
Ok(None)
368380
}
369-
_ => panic!("can only wait for finalized or ready extrinsic status"),
381+
_ => panic!("can only wait for finalized, in block, broadcast and ready extrinsic status"),
370382
}
371383
}
372384

src/rpc/client.rs

+66
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ use ws::{CloseCode, Handler, Handshake, Message, Result, Sender};
2222
#[derive(Debug, PartialEq)]
2323
pub enum XtStatus {
2424
Finalized,
25+
InBlock,
26+
Broadcast,
2527
Ready,
2628
Future,
2729
Error,
@@ -104,6 +106,40 @@ pub fn on_extrinsic_msg_until_finalized(
104106
Ok(())
105107
}
106108

109+
pub fn on_extrinsic_msg_until_in_block(
110+
msg: Message,
111+
out: Sender,
112+
result: ThreadOut<String>,
113+
) -> Result<()> {
114+
let retstr = msg.as_text().unwrap();
115+
debug!("got msg {}", retstr);
116+
match parse_status(retstr) {
117+
(XtStatus::Finalized, val) => end_process(out, result, val),
118+
(XtStatus::InBlock, val) => end_process(out, result, val),
119+
(XtStatus::Future, _) => end_process(out, result, None),
120+
(XtStatus::Error, _) => end_process(out, result, None),
121+
_ => (),
122+
};
123+
Ok(())
124+
}
125+
126+
pub fn on_extrinsic_msg_until_broadcast(
127+
msg: Message,
128+
out: Sender,
129+
result: ThreadOut<String>,
130+
) -> Result<()> {
131+
let retstr = msg.as_text().unwrap();
132+
debug!("got msg {}", retstr);
133+
match parse_status(retstr) {
134+
(XtStatus::Finalized, val) => end_process(out, result, val),
135+
(XtStatus::Broadcast, _) => end_process(out, result, None),
136+
(XtStatus::Future, _) => end_process(out, result, None),
137+
(XtStatus::Error, _) => end_process(out, result, None),
138+
_ => (),
139+
};
140+
Ok(())
141+
}
142+
107143
pub fn on_extrinsic_msg_until_ready(
108144
msg: Message,
109145
out: Sender,
@@ -150,6 +186,12 @@ fn parse_status(msg: &str) -> (XtStatus, Option<String>) {
150186
if let Some(hash) = obj.get("finalized") {
151187
info!("finalized: {:?}", hash);
152188
(XtStatus::Finalized, Some(hash.to_string()))
189+
} else if let Some(hash) = obj.get("inBlock") {
190+
info!("inBlock: {:?}", hash);
191+
(XtStatus::InBlock, Some(hash.to_string()))
192+
} else if let Some(array) = obj.get("broadcast") {
193+
info!("broadcast: {:?}", array);
194+
(XtStatus::Broadcast, Some(array.to_string()))
153195
} else {
154196
(XtStatus::Unknown, None)
155197
}
@@ -176,6 +218,30 @@ mod tests {
176218
let msg = "{\"jsonrpc\":\"2.0\",\"method\":\"author_extrinsicUpdate\",\"params\":{\"result\":\"ready\",\"subscription\":7185}}";
177219
assert_eq!(parse_status(msg), (XtStatus::Ready, None));
178220

221+
let msg = "{\"jsonrpc\":\"2.0\",\"method\":\"author_extrinsicUpdate\",\"params\":{\"result\":{\"broadcast\":[\"QmfSF4VYWNqNf5KYHpDEdY8Rt1nPUgSkMweDkYzhSWirGY\",\"Qmchhx9SRFeNvqjUK4ZVQ9jH4zhARFkutf9KhbbAmZWBLx\",\"QmQJAqr98EF1X3YfjVKNwQUG9RryqX4Hv33RqGChbz3Ncg\"]},\"subscription\":232}}";
222+
assert_eq!(
223+
parse_status(msg),
224+
(
225+
XtStatus::Broadcast,
226+
Some(
227+
"[\"QmfSF4VYWNqNf5KYHpDEdY8Rt1nPUgSkMweDkYzhSWirGY\",\"Qmchhx9SRFeNvqjUK4ZVQ9jH4zhARFkutf9KhbbAmZWBLx\",\"QmQJAqr98EF1X3YfjVKNwQUG9RryqX4Hv33RqGChbz3Ncg\"]"
228+
.to_string()
229+
)
230+
)
231+
);
232+
233+
let msg = "{\"jsonrpc\":\"2.0\",\"method\":\"author_extrinsicUpdate\",\"params\":{\"result\":{\"inBlock\":\"0x3104d362365ff5ddb61845e1de441b56c6722e94c1aee362f8aa8ba75bd7a3aa\"},\"subscription\":232}}";
234+
assert_eq!(
235+
parse_status(msg),
236+
(
237+
XtStatus::InBlock,
238+
Some(
239+
"\"0x3104d362365ff5ddb61845e1de441b56c6722e94c1aee362f8aa8ba75bd7a3aa\""
240+
.to_string()
241+
)
242+
)
243+
);
244+
179245
let msg = "{\"jsonrpc\":\"2.0\",\"method\":\"author_extrinsicUpdate\",\"params\":{\"result\":{\"finalized\":\"0x934385b11c483498e2b5bca64c2e8ef76ad6c74d3372a05595d3a50caf758d52\"},\"subscription\":7185}}";
180246
assert_eq!(
181247
parse_status(msg),

src/rpc/mod.rs

+8
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@ pub fn send_extrinsic(url: String, json_req: String, result_in: ThreadOut<String
3434
start_rpc_client_thread(url, json_req, result_in, on_extrinsic_msg_until_ready)
3535
}
3636

37+
pub fn send_extrinsic_and_wait_until_broadcast(url: String, json_req: String, result_in: ThreadOut<String>) {
38+
start_rpc_client_thread(url, json_req, result_in, on_extrinsic_msg_until_broadcast)
39+
}
40+
41+
pub fn send_extrinsic_and_wait_until_in_block(url: String, json_req: String, result_in: ThreadOut<String>) {
42+
start_rpc_client_thread(url, json_req, result_in, on_extrinsic_msg_until_in_block)
43+
}
44+
3745
pub fn send_extrinsic_and_wait_until_finalized(
3846
url: String,
3947
json_req: String,

0 commit comments

Comments
 (0)