|
2 | 2 | //! |
3 | 3 | //! This module contains the definition of the raw client that wraps the transport method |
4 | 4 |
|
5 | | -use std::collections::{HashMap, HashSet, VecDeque}; |
| 5 | +use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecDeque}; |
6 | 6 | use std::io::{BufRead, BufReader, Read, Write}; |
7 | 7 | use std::mem::drop; |
8 | 8 | use std::net::{TcpStream, ToSocketAddrs}; |
@@ -647,8 +647,8 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> { |
647 | 647 | fn batch_call(&self, batch: &Batch) -> Result<Vec<serde_json::Value>, Error> { |
648 | 648 | let mut raw = Vec::new(); |
649 | 649 |
|
650 | | - let mut missing_responses = HashSet::new(); |
651 | | - let mut answer = Vec::new(); |
| 650 | + let mut missing_responses = BTreeSet::new(); |
| 651 | + let mut answers = BTreeMap::new(); |
652 | 652 |
|
653 | 653 | // Add our listener to the map before we send the request, Here we will clone the sender |
654 | 654 | // for every request id, so that we only have to monitor one receiver. |
@@ -681,32 +681,27 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> { |
681 | 681 |
|
682 | 682 | self.increment_calls(); |
683 | 683 |
|
684 | | - while !missing_responses.is_empty() { |
685 | | - let req_id = *missing_responses.iter().next().unwrap(); |
686 | | - let resp = match self.recv(&receiver, req_id) { |
687 | | - Ok(resp) => resp, |
| 684 | + for req_id in missing_responses.iter() { |
| 685 | + match self.recv(&receiver, *req_id) { |
| 686 | + Ok(mut resp) => answers.insert( |
| 687 | + resp["id"].as_u64().unwrap_or_default(), |
| 688 | + resp["result"].take(), |
| 689 | + ), |
688 | 690 | Err(e) => { |
689 | 691 | // In case of error our sender could still be left in the map, depending on where |
690 | 692 | // the error happened. Just in case, try to remove it here |
691 | 693 | warn!("got error for req_id {}: {:?}", req_id, e); |
692 | 694 | warn!("removing all waiting req of this batch"); |
693 | 695 | let mut guard = self.waiting_map.lock()?; |
694 | 696 | for req_id in missing_responses.iter() { |
695 | | - guard.remove(&req_id); |
| 697 | + guard.remove(req_id); |
696 | 698 | } |
697 | 699 | return Err(e); |
698 | 700 | } |
699 | 701 | }; |
700 | | - let resp_id = resp["id"].as_u64().unwrap() as usize; |
701 | | - |
702 | | - missing_responses.remove(&resp_id); |
703 | | - answer.push(resp); |
704 | 702 | } |
705 | 703 |
|
706 | | - answer.sort_by(|a, b| a["id"].as_u64().partial_cmp(&b["id"].as_u64()).unwrap()); |
707 | | - let answer = answer.into_iter().map(|mut x| x["result"].take()).collect(); |
708 | | - |
709 | | - Ok(answer) |
| 704 | + Ok(answers.into_iter().map(|(_, r)| r).collect()) |
710 | 705 | } |
711 | 706 |
|
712 | 707 | fn block_headers_subscribe_raw(&self) -> Result<RawHeaderNotification, Error> { |
|
0 commit comments