use fuel_core_types::{ blockchain::SealedBlockHeader, services::p2p::Transactions, }; use libp2p::{ request_response::OutboundFailure, PeerId, }; use serde::{ Deserialize, Serialize, }; use std::ops::Range; use thiserror::Error; use tokio::sync::oneshot; pub(crate) const REQUEST_RESPONSE_PROTOCOL_ID: &str = "/fuel/req_res/0.0.1"; /// Max Size in Bytes of the Request Message #[cfg(test)] pub(crate) const MAX_REQUEST_SIZE: usize = core::mem::size_of::(); #[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone)] pub enum RequestMessage { SealedHeaders(Range), Transactions(Range), } #[derive(Debug, Clone, Serialize, Deserialize)] pub enum ResponseMessage { SealedHeaders(Option>), Transactions(Option>), } pub type OnResponse = oneshot::Sender<(PeerId, Result)>; #[derive(Debug)] pub enum ResponseSender { SealedHeaders(OnResponse>>), Transactions(OnResponse>>), } #[derive(Debug, Error)] pub enum RequestError { #[error("Not currently connected to any peers")] NoPeersConnected, } #[derive(Debug, Error)] pub enum ResponseError { /// This is the raw error from [`libp2p-request-response`] #[error("P2P outbound error {0}")] P2P(OutboundFailure), /// The peer responded with an invalid response type #[error("Peer response message was of incorrect type")] TypeMismatch, } /// Errors than can occur when attempting to send a response #[derive(Debug, Eq, PartialEq, Error)] pub enum ResponseSendError { #[error("Response channel does not exist")] ResponseChannelDoesNotExist, #[error("Failed to send response")] SendingResponseFailed, #[error("Failed to convert response to intermediate format")] ConversionToIntermediateFailed, }