chunk_streamer/
chunk_streamer.rs

1use async_trait::async_trait;
2use autonomi::{Chunk, ChunkAddress};
3use autonomi::client::GetError;
4use self_encryption::DataMap;
5use tokio::sync::mpsc::channel;
6use crate::chunk_receiver::ChunkReceiver;
7use crate::chunk_sender::ChunkSender;
8
9#[async_trait]
10pub trait ChunkGetter: Clone + Send + Sync + 'static {
11    async fn chunk_get(&self, address: &ChunkAddress) -> Result<Chunk, GetError>;
12}
13
14pub struct ChunkStreamer<T> {
15    id: String,
16    data_map: DataMap,
17    chunk_getter: T,
18    download_threads: usize,
19}
20
21impl<T: ChunkGetter> ChunkStreamer<T> {
22    pub fn new(id: String, data_map: DataMap, chunk_getter: T, download_threads: usize) -> ChunkStreamer<T> {
23        ChunkStreamer { id, data_map, chunk_getter, download_threads }
24    }
25    
26    pub fn open(&self, range_from: u64, range_to: u64) -> ChunkReceiver {
27        let (sender, receiver) = channel(self.download_threads);
28        let chunk_sender = ChunkSender::new(sender, self.id.clone(), self.chunk_getter.clone(), self.data_map.clone());
29        tokio::spawn( Box::pin(async move { chunk_sender.send(range_from, range_to).await; }));
30        ChunkReceiver::new(receiver, self.id.clone())
31    }
32}