mod fetched;
pub use fetched::Fetched;
use brk_error::Result;
use brk_rpc::{Client, MempoolState};
use brk_types::{MempoolEntryInfo, Txid};
use parking_lot::RwLock;
use crate::{
State,
stores::{TxGraveyard, TxStore},
};
const MAX_TX_FETCHES_PER_CYCLE: usize = 10_000;
pub struct Fetcher;
impl Fetcher {
pub fn fetch(client: &Client, lock: &RwLock<State>) -> Result<Option<Fetched>> {
let Some(MempoolState {
entries,
gbt,
min_fee,
}) = client.fetch_mempool_state()?
else {
return Ok(None);
};
let new_txids = {
let state = lock.read();
Self::new_txids(&entries, &state.txs, &state.graveyard)
};
let new_raws = client.get_raw_transactions(&new_txids)?;
Ok(Some(Fetched {
entries_info: entries,
new_raws,
gbt,
min_fee,
}))
}
fn new_txids(
entries_info: &[MempoolEntryInfo],
known: &TxStore,
graveyard: &TxGraveyard,
) -> Vec<Txid> {
entries_info
.iter()
.filter(|info| !known.contains(&info.txid) && !graveyard.contains(&info.txid))
.take(MAX_TX_FETCHES_PER_CYCLE)
.map(|info| info.txid)
.collect()
}
}