use futures::channel::oneshot;
use sc_network::{request_responses::RequestFailure, NetworkBackend, ProtocolName};
use sc_network_common::sync::message::{BlockData, BlockRequest};
use sc_network_types::PeerId;
use sp_runtime::traits::Block as BlockT;
use std::{fmt, 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>: fmt::Debug + Send + Sync {
fn protocol_name(&self) -> &ProtocolName;
async fn download_blocks(
&self,
who: PeerId,
request: BlockRequest<Block>,
) -> Result<Result<(Vec<u8>, ProtocolName), 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, N: NetworkBackend<Block, <Block as BlockT>::Hash>> {
pub server: Box<dyn BlockServer<Block>>,
pub downloader: Arc<dyn BlockDownloader<Block>>,
pub request_response_config: N::RequestResponseProtocolConfig,
}