use std::sync::Arc;
use tokio::sync::mpsc;
const DEFAULT_PROGRESS_CHANNEL_CAPACITY: usize = 256;
#[derive(Debug, Clone)]
pub enum PullProgress {
Resolving {
reference: Arc<str>,
},
Resolved {
reference: Arc<str>,
manifest_digest: Arc<str>,
layer_count: usize,
total_download_bytes: Option<u64>,
},
LayerDownloadProgress {
layer_index: usize,
digest: Arc<str>,
downloaded_bytes: u64,
total_bytes: Option<u64>,
},
LayerDownloadComplete {
layer_index: usize,
digest: Arc<str>,
downloaded_bytes: u64,
},
LayerExtractStarted {
layer_index: usize,
diff_id: Arc<str>,
},
LayerExtractProgress {
layer_index: usize,
bytes_read: u64,
total_bytes: u64,
},
LayerExtractComplete {
layer_index: usize,
diff_id: Arc<str>,
},
LayerIndexStarted {
layer_index: usize,
},
LayerIndexComplete {
layer_index: usize,
},
Complete {
reference: Arc<str>,
layer_count: usize,
},
}
pub struct PullProgressHandle {
rx: mpsc::Receiver<PullProgress>,
}
#[derive(Clone)]
pub struct PullProgressSender {
tx: mpsc::Sender<PullProgress>,
}
impl PullProgressHandle {
pub async fn recv(&mut self) -> Option<PullProgress> {
self.rx.recv().await
}
pub fn into_receiver(self) -> mpsc::Receiver<PullProgress> {
self.rx
}
}
impl PullProgressSender {
pub fn send(&self, event: PullProgress) {
let _ = self.tx.try_send(event);
}
}
pub fn progress_channel() -> (PullProgressHandle, PullProgressSender) {
let (tx, rx) = mpsc::channel(DEFAULT_PROGRESS_CHANNEL_CAPACITY);
(PullProgressHandle { rx }, PullProgressSender { tx })
}