Merge Notifier and TransactionsPoolNotifier (#10591)
* Merge `Notifier` and `TransactionsPoolNotifier` * fix tests
This commit is contained in:
@@ -129,15 +129,13 @@ pub enum ImportDestination {
|
||||
Future,
|
||||
}
|
||||
|
||||
type Listener = Box<Fn(&[H256]) + Send + Sync>;
|
||||
|
||||
/// Light transaction queue. See module docs for more details.
|
||||
#[derive(Default)]
|
||||
pub struct TransactionQueue {
|
||||
by_account: HashMap<Address, AccountTransactions>,
|
||||
by_hash: H256FastMap<PendingTransaction>,
|
||||
listeners: Vec<Listener>,
|
||||
tx_statuses_listeners: Vec<mpsc::UnboundedSender<Arc<Vec<(H256, TxStatus)>>>>,
|
||||
pending_listeners: Vec<mpsc::UnboundedSender<Arc<Vec<H256>>>>,
|
||||
full_listeners: Vec<mpsc::UnboundedSender<Arc<Vec<(H256, TxStatus)>>>>,
|
||||
}
|
||||
|
||||
impl fmt::Debug for TransactionQueue {
|
||||
@@ -145,7 +143,8 @@ impl fmt::Debug for TransactionQueue {
|
||||
fmt.debug_struct("TransactionQueue")
|
||||
.field("by_account", &self.by_account)
|
||||
.field("by_hash", &self.by_hash)
|
||||
.field("listeners", &self.listeners.len())
|
||||
.field("pending_listeners", &self.pending_listeners.len())
|
||||
.field("full_listeners", &self.pending_listeners.len())
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
@@ -360,30 +359,40 @@ impl TransactionQueue {
|
||||
}
|
||||
|
||||
/// Add a transaction queue listener.
|
||||
pub fn add_listener(&mut self, f: Listener) {
|
||||
self.listeners.push(f);
|
||||
pub fn pending_transactions_receiver(&mut self) -> mpsc::UnboundedReceiver<Arc<Vec<H256>>> {
|
||||
let (sender, receiver) = mpsc::unbounded();
|
||||
self.pending_listeners.push(sender);
|
||||
receiver
|
||||
}
|
||||
|
||||
/// Add a transaction queue listener.
|
||||
pub fn tx_statuses_receiver(&mut self) -> mpsc::UnboundedReceiver<Arc<Vec<(H256, TxStatus)>>> {
|
||||
pub fn full_transactions_receiver(&mut self) -> mpsc::UnboundedReceiver<Arc<Vec<(H256, TxStatus)>>> {
|
||||
let (sender, receiver) = mpsc::unbounded();
|
||||
self.tx_statuses_listeners.push(sender);
|
||||
self.full_listeners.push(sender);
|
||||
receiver
|
||||
}
|
||||
|
||||
/// Notifies all listeners about new pending transaction.
|
||||
fn notify(&mut self, hashes: &[H256], status: TxStatus) {
|
||||
for listener in &self.listeners {
|
||||
listener(hashes)
|
||||
if status == TxStatus::Added {
|
||||
let to_pending_send: Arc<Vec<H256>> = Arc::new(
|
||||
hashes
|
||||
.into_iter()
|
||||
.map(|hash| hash.clone())
|
||||
.collect()
|
||||
);
|
||||
self.pending_listeners.retain(|listener| listener.unbounded_send(to_pending_send.clone()).is_ok());
|
||||
|
||||
}
|
||||
|
||||
let to_send: Arc<Vec<(H256, TxStatus)>> = Arc::new(
|
||||
let to_full_send: Arc<Vec<(H256, TxStatus)>> = Arc::new(
|
||||
hashes
|
||||
.into_iter()
|
||||
.map(|hash| (hash.clone(), status)).collect()
|
||||
.map(|hash| (hash.clone(), status))
|
||||
.collect()
|
||||
);
|
||||
|
||||
self.tx_statuses_listeners.retain(| listener| listener.unbounded_send(to_send.clone()).is_ok());
|
||||
self.full_listeners.retain(|listener| listener.unbounded_send(to_full_send.clone()).is_ok());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user