scatter_net/legacy/peer/methods/
fetch_blob.rs

1use n0_future::StreamExt;
2use ps_hkey::Hkey;
3
4use crate::{FetchRequest, FetchResponse, Packet, Peer};
5
6impl Peer {
7    pub async fn fetch_blob(self, hkey: Hkey) -> Result<Option<FetchResponse>, PeerFetchBlobError> {
8        let mut interaction = Self::begin_interaction(self.clone()).await?;
9
10        let request = FetchRequest {
11            hash: hkey.to_string(),
12        };
13
14        let packet = Packet::FetchRequest(request);
15
16        interaction.send_packet(packet).await?;
17
18        while let Some(response) = interaction.next().await {
19            let packet = response?;
20
21            if let Packet::FetchResponse(response) = packet {
22                return Ok(Some(response));
23            }
24
25            packet.process(self.clone()).await?;
26        }
27
28        Ok(None)
29    }
30}
31
32#[derive(thiserror::Error, Debug)]
33pub enum PeerFetchBlobError {
34    #[error(transparent)]
35    BeginInteraction(#[from] crate::PeerBeginInteractionError),
36    #[error(transparent)]
37    PacketProcessError(#[from] crate::PacketProcessError),
38    #[error("Error reading packet: {0}")]
39    ReadPacket(#[from] crate::InteractionReadPacketError),
40    #[error(transparent)]
41    SendPacket(#[from] crate::InteractionSendPacketError),
42}