reth_cli_commands/download/
session.rs1use super::progress::{DownloadRequestLimiter, SharedProgress};
2use eyre::Result;
3use reth_cli_util::cancellation::CancellationToken;
4use std::{
5 path::{Path, PathBuf},
6 sync::Arc,
7 time::Duration,
8};
9
10#[derive(Clone)]
12pub(crate) struct DownloadSession {
13 progress: Option<Arc<SharedProgress>>,
15 request_limiter: Option<Arc<DownloadRequestLimiter>>,
17 cancel_token: CancellationToken,
19 retry_backoff: Option<Duration>,
21}
22
23impl DownloadSession {
24 pub(crate) fn new(
26 progress: Option<Arc<SharedProgress>>,
27 request_limiter: Option<Arc<DownloadRequestLimiter>>,
28 cancel_token: CancellationToken,
29 ) -> Self {
30 Self { progress, request_limiter, cancel_token, retry_backoff: None }
31 }
32
33 pub(crate) const fn with_retry_backoff(mut self, retry_backoff: Option<Duration>) -> Self {
35 self.retry_backoff = retry_backoff;
36 self
37 }
38
39 pub(crate) fn retry_delay(&self, default: Duration) -> Duration {
41 self.retry_backoff.unwrap_or(default)
42 }
43
44 pub(crate) fn progress(&self) -> Option<&Arc<SharedProgress>> {
46 self.progress.as_ref()
47 }
48
49 pub(crate) fn request_limiter(&self) -> Option<&Arc<DownloadRequestLimiter>> {
51 self.request_limiter.as_ref()
52 }
53
54 pub(crate) fn require_request_limiter(&self) -> Result<&Arc<DownloadRequestLimiter>> {
56 self.request_limiter().ok_or_else(|| eyre::eyre!("Missing download request limiter"))
57 }
58
59 pub(crate) fn cancel_token(&self) -> &CancellationToken {
61 &self.cancel_token
62 }
63
64 pub(crate) fn record_archive_output_complete(&self, bytes: u64) {
66 if let Some(progress) = self.progress() {
67 progress.record_archive_output_complete(bytes);
68 }
69 }
70}
71
72#[derive(Clone)]
74pub(crate) struct ArchiveProcessContext {
75 target_dir: PathBuf,
77 static_files_dir: Option<PathBuf>,
79 cache_dir: Option<PathBuf>,
81 session: DownloadSession,
83}
84
85impl ArchiveProcessContext {
86 pub(crate) fn new(
88 target_dir: PathBuf,
89 static_files_dir: Option<PathBuf>,
90 cache_dir: Option<PathBuf>,
91 session: DownloadSession,
92 ) -> Self {
93 Self { target_dir, static_files_dir, cache_dir, session }
94 }
95
96 pub(crate) fn target_dir(&self) -> &Path {
98 &self.target_dir
99 }
100
101 pub(crate) fn static_files_dir(&self) -> Option<&Path> {
103 self.static_files_dir.as_deref()
104 }
105
106 pub(crate) fn cache_dir(&self) -> Option<&Path> {
108 self.cache_dir.as_deref()
109 }
110
111 pub(crate) fn session(&self) -> &DownloadSession {
113 &self.session
114 }
115}