scatter_net/scatter_net/peer/implementations/
async_store.rs

1use std::sync::Arc;
2
3use ps_datachunk::{OwnedDataChunk, PsDataChunkError};
4use ps_hkey::{AsyncStore, PsHkeyError};
5use ps_promise::{Promise, PromiseRejection};
6
7use crate::{InteractionAsyncStoreError, Peer, PeerBeginInteractionError};
8
9impl AsyncStore for Peer {
10    type Chunk = OwnedDataChunk;
11    type Error = PeerAsyncStoreError;
12
13    fn get(&self, hash: &ps_hash::Hash) -> ps_promise::Promise<Self::Chunk, Self::Error> {
14        let peer = self.clone();
15        let hash = Arc::from(*hash);
16
17        Promise::new(async move {
18            let interaction = peer.begin_interaction().await?;
19
20            Ok(interaction.get(&hash).await?)
21        })
22    }
23
24    fn put_encrypted<C: ps_datachunk::DataChunk>(&self, chunk: C) -> Promise<(), Self::Error> {
25        let peer = self.clone();
26        let chunk = chunk.into_owned();
27
28        Promise::new(async move {
29            let interaction = peer.begin_interaction().await?;
30
31            Ok(interaction.put_encrypted(chunk).await?)
32        })
33    }
34}
35
36#[derive(thiserror::Error, Debug)]
37pub enum PeerAsyncStoreError {
38    #[error("This Promise was already consumed")]
39    AlreadyConsumed,
40    #[error(transparent)]
41    BeginInteraction(#[from] PeerBeginInteractionError),
42    #[error(transparent)]
43    DataChunk(#[from] PsDataChunkError),
44    #[error(transparent)]
45    Hkey(#[from] PsHkeyError),
46    #[error(transparent)]
47    Interaction(#[from] InteractionAsyncStoreError),
48}
49
50impl PromiseRejection for PeerAsyncStoreError {
51    fn already_consumed() -> Self {
52        Self::AlreadyConsumed
53    }
54}