use super::{config::Config, error::Error, request::Request};
use futures::{
channel::{mpsc, oneshot},
SinkExt,
};
use sp_core::Bytes;
use std::future::Future;
pub struct ApiBackend {
pub(super) request_receiver: mpsc::Receiver<Request>,
}
#[derive(Clone)]
pub struct Api {
request_sender: mpsc::Sender<Request>,
}
impl Api {
pub fn new(config: &Config) -> (Self, ApiBackend) {
let (request_sender, request_receiver) = mpsc::channel(config.substrate.request_buffer);
(Self { request_sender }, ApiBackend { request_receiver })
}
pub async fn submit_extrinsic(
&mut self,
extrinsic: Bytes,
) -> impl Future<Output = Result<(), Error>> {
let (reply_sender, reply_receiver) = oneshot::channel();
let res = self
.request_sender
.feed(Request::SubmitExtrinsic { extrinsic, reply_sender })
.await;
async move {
res.map_err(|_| Error::ServiceUnavailable)?;
reply_receiver.await.map_err(|_| Error::ServiceUnavailable)?
}
}
}