use bon::Builder;
use tracing::{debug, info, instrument};
use crate::{Error, subscription::Subscription};
#[derive(Debug, Default, Clone, Builder)]
pub struct Client {
#[builder(into, default = "https://mev-share.flashbots.net")]
pub endpoint: String,
#[builder(into, default = format!("{}/{}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")))]
pub user_agent: String,
#[builder(default = reqwest::Client::builder().build().expect("Failed to build reqwest client"))]
pub client: reqwest::Client,
}
impl Client {
#[instrument(skip(self), fields(endpoint = %self.endpoint, user_agent = %self.user_agent))]
pub async fn subscribe(&self) -> Result<Subscription, Error> {
info!("connecting to MEV-Share stream");
let response = self
.client
.get(&self.endpoint)
.header("Accept", "text/event-stream")
.header("Cache-Control", "no-cache")
.header("User-Agent", &self.user_agent)
.send()
.await?
.error_for_status()?;
debug!(status = %response.status(), "connected successfully");
Ok(Subscription { response })
}
}