Skip to content

Commit db235b9

Browse files
committed
add: broadcast and inblock function
1 parent e2f1ff6 commit db235b9

File tree

3 files changed

+67
-23
lines changed

3 files changed

+67
-23
lines changed

src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -354,9 +354,9 @@ where
354354
rpc::send_extrinsic(self.url.clone(), jsonreq, result_in);
355355
let res = result_out.recv().unwrap();
356356
info!("inBlock: {}", res);
357-
Ok(None)
357+
Ok(Some(hexstr_to_hash(res).unwrap()))
358358
}
359-
_ => panic!("can only wait for finalized or ready extrinsic status"),
359+
_ => panic!("can only wait for finalized, ready, inBlock or broadcast extrinsic status"),
360360
}
361361
}
362362

src/rpc/client.rs

+57-21
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,41 @@ pub fn on_subscription_msg(msg: Message, _out: Sender, result: ThreadOut<String>
8686
};
8787
Ok(())
8888
}
89+
pub fn on_extrinsic_msg_until_in_block(
90+
msg: Message,
91+
out: Sender,
92+
result: ThreadOut<String>,
93+
) -> Result<()> {
94+
let retstr = msg.as_text().unwrap();
95+
debug!("got msg {}", retstr);
96+
match parse_status(retstr) {
97+
(XtStatus::Finalized, val) => end_process(out, result, val),
98+
(XtStatus::InBlock, val) => end_process(out, result, val),
99+
(XtStatus::Future, _) => end_process(out, result, None),
100+
(XtStatus::Error, _) => end_process(out, result, None),
101+
_ => (),
102+
};
103+
Ok(())
104+
}
105+
106+
107+
pub fn on_extrinsic_msg_until_broadcast(
108+
msg: Message,
109+
out: Sender,
110+
result: ThreadOut<String>,
111+
) -> Result<()> {
112+
let retstr = msg.as_text().unwrap();
113+
debug!("got msg {}", retstr);
114+
match parse_status(retstr) {
115+
(XtStatus::Finalized, val) => end_process(out, result, val),
116+
(XtStatus::Broadcast, _) => end_process(out, result, None),
117+
(XtStatus::Future, _) => end_process(out, result, None),
118+
(XtStatus::Error, _) => end_process(out, result, None),
119+
_ => (),
120+
};
121+
Ok(())
122+
}
123+
89124

90125
pub fn on_extrinsic_msg_until_finalized(
91126
msg: Message,
@@ -96,7 +131,7 @@ pub fn on_extrinsic_msg_until_finalized(
96131
debug!("got msg {}", retstr);
97132
match parse_status(retstr) {
98133
(XtStatus::Finalized, val) => end_process(out, result, val),
99-
(XtStatus::Error, e) => end_process(out, result, e),
134+
(XtStatus::Error, _) => end_process(out, result, None),
100135
(XtStatus::Future, _) => {
101136
warn!("extrinsic has 'future' status. aborting");
102137
end_process(out, result, None);
@@ -116,23 +151,16 @@ pub fn on_extrinsic_msg_until_ready(
116151
match parse_status(retstr) {
117152
(XtStatus::Finalized, val) => end_process(out, result, val),
118153
(XtStatus::Ready, _) => end_process(out, result, None),
119-
(XtStatus::InBlock, _) => end_process(out, result, None),
120-
(XtStatus::Broadcast, _) => end_process(out, result, None),
121154
(XtStatus::Future, _) => end_process(out, result, None),
122-
(XtStatus::Error, e) => end_process(out, result, e),
155+
(XtStatus::Error, _) => end_process(out, result, None),
123156
_ => (),
124157
};
125158
Ok(())
126159
}
127160

128161
fn end_process(out: Sender, result: ThreadOut<String>, value: Option<String>) {
129162
// return result to calling thread
130-
debug!(
131-
"Thread end result :{:?} value:{:?}",
132-
result.clone(),
133-
value.clone()
134-
);
135-
let val = value.unwrap();
163+
let val = value.unwrap_or_else(|| "nix".to_string());
136164
result.send(val).unwrap();
137165
out.close(CloseCode::Normal).unwrap();
138166
}
@@ -141,13 +169,12 @@ fn parse_status(msg: &str) -> (XtStatus, Option<String>) {
141169
let value: serde_json::Value = serde_json::from_str(msg).unwrap();
142170
match value["error"].as_object() {
143171
Some(obj) => {
144-
let error_message = obj.get("message").unwrap().as_str().unwrap().to_owned();
145172
error!(
146173
"extrinsic error code {}: {}",
147174
obj.get("code").unwrap().as_u64().unwrap(),
148-
error_message.clone()
175+
obj.get("message").unwrap().as_str().unwrap()
149176
);
150-
(XtStatus::Error, Some(error_message))
177+
(XtStatus::Error, None)
151178
}
152179
None => match value["params"]["result"].as_object() {
153180
Some(obj) => {
@@ -156,7 +183,11 @@ fn parse_status(msg: &str) -> (XtStatus, Option<String>) {
156183
(XtStatus::Finalized, Some(hash.to_string()))
157184
}
158185
else if let Some(hash) = obj.get("inBlock") {
159-
info!("inBlock: {:?}", hash);
186+
info!("InBlock: {:?}", hash);
187+
(XtStatus::InBlock, Some(hash.to_string()))
188+
}
189+
else if let Some(hash) = obj.get("broadcast") {
190+
info!("Broadcast: {:?}", hash);
160191
(XtStatus::InBlock, Some(hash.to_string()))
161192
}
162193
else {
@@ -201,7 +232,15 @@ mod tests {
201232
assert_eq!(parse_status(msg), (XtStatus::Future, None));
202233

203234
let msg = "{\"jsonrpc\":\"2.0\",\"method\":\"author_extrinsicUpdate\",\"params\":{\"result\":{\"broadcast\":[\"QmfSF4VYWNqNf5KYHpDEdY8Rt1nPUgSkMweDkYzhSWirGY\",\"Qmchhx9SRFeNvqjUK4ZVQ9jH4zhARFkutf9KhbbAmZWBLx\",\"QmQJAqr98EF1X3YfjVKNwQUG9RryqX4Hv33RqGChbz3Ncg\"]},\"subscription\":232}}";
204-
assert_eq!(parse_status(msg), (XtStatus::Broadcast, None));
235+
assert_eq!(
236+
parse_status(msg), (
237+
XtStatus::Broadcast,
238+
Some(
239+
"[\"QmfSF4VYWNqNf5KYHpDEdY8Rt1nPUgSkMweDkYzhSWirGY\",\"Qmchhx9SRFeNvqjUK4ZVQ9jH4zhARFkutf9KhbbAmZWBLx\",\"QmQJAqr98EF1X3YfjVKNwQUG9RryqX4Hv33RqGChbz3Ncg\"]"
240+
.to_string()
241+
)
242+
)
243+
);
205244

206245
let msg = "{\"jsonrpc\":\"2.0\",\"method\":\"author_extrinsicUpdate\",\"params\":{\"result\":{\"inBlock\":\"0x3104d362365ff5ddb61845e1de441b56c6722e94c1aee362f8aa8ba75bd7a3aa\"},\"subscription\":232}}";
207246
assert_eq!(
@@ -215,15 +254,12 @@ mod tests {
215254
);
216255

217256
let msg = "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":-32700,\"message\":\"Parse error\"},\"id\":null}";
218-
assert_eq!(parse_status(msg), (XtStatus::Error, Some("Parse error".into())));
257+
assert_eq!(parse_status(msg), (XtStatus::Error, None));
219258

220259
let msg = "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":1010,\"message\":\"Invalid Transaction\",\"data\":0},\"id\":\"4\"}";
221-
assert_eq!(parse_status(msg), (XtStatus::Error, Some("Invalid Transaction".into())));
260+
assert_eq!(parse_status(msg), (XtStatus::Error, None));
222261

223262
let msg = "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":1001,\"message\":\"Extrinsic has invalid format.\"},\"id\":\"0\"}";
224-
assert_eq!(parse_status(msg), (XtStatus::Error, Some("Extrinsic has invalid format.".into())));
225-
226-
let msg = r#"{"jsonrpc":"2.0","error":{"code":1002,"message":"Verification Error: Execution(Wasmi(Trap(Trap { kind: Unreachable })))","data":"RuntimeApi(\"Execution(Wasmi(Trap(Trap { kind: Unreachable })))\")"},"id":"3"}"#;
227-
assert_eq!(parse_status(msg), (XtStatus::Error, Some("Verification Error: Execution(Wasmi(Trap(Trap { kind: Unreachable })))".into())));
263+
assert_eq!(parse_status(msg), (XtStatus::Error, None));
228264
}
229265
}

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)