scatter_net/scatter_net/peer/implementations/
async_store.rs1use 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}