scatter_net/legacy/peer/methods/
fetch_blob.rs1use 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}