use futures::channel::oneshot;
use libp2p::PeerId;
use sc_network::request_responses::{ProtocolConfig, RequestFailure};
use sc_network_common::sync::message::{BlockData, BlockRequest};
use sp_runtime::traits::Block as BlockT;
use std::sync::Arc;
#[async_trait::async_trait]
pub trait BlockServer<Block: BlockT>: Send {
async fn run(&mut self);
}
#[async_trait::async_trait]
pub trait BlockDownloader<Block: BlockT>: Send + Sync {
async fn download_blocks(
&self,
who: PeerId,
request: BlockRequest<Block>,
) -> Result<Result<Vec<u8>, RequestFailure>, oneshot::Canceled>;
fn block_response_into_blocks(
&self,
request: &BlockRequest<Block>,
response: Vec<u8>,
) -> Result<Vec<BlockData<Block>>, BlockResponseError>;
}
#[derive(Debug)]
pub enum BlockResponseError {
DecodeFailed(String),
ExtractionFailed(String),
}
pub struct BlockRelayParams<Block: BlockT> {
pub server: Box<dyn BlockServer<Block>>,
pub downloader: Arc<dyn BlockDownloader<Block>>,
pub request_response_config: ProtocolConfig,
}