pipedash_core/application/
mod.rs1mod config_watcher;
2pub mod fetch_scheduler;
3pub mod services;
4#[cfg(test)]
5pub(crate) mod test_support;
6
7use std::sync::Arc;
8
9pub use config_watcher::ConfigWatcher;
10pub use fetch_scheduler::{
11 AttemptHandle,
12 BackoffPolicy,
13 ClaimKind,
14 FetchClaim,
15 FetchResult,
16 FetchScheduler,
17 ForcedClaim,
18 Generation,
19 Outcome,
20 ScheduleView,
21};
22pub use services::device_alerts::recording_bus;
23pub use services::health_service::{
24 refresh_notifications,
25 HealthHandle,
26 HealthInput,
27 HealthReceivers,
28 HealthSnapshot,
29 LocalNotification,
30 NotificationState,
31 ProviderHealthInput,
32 ProviderHealthService,
33 ProviderHealthState,
34};
35pub use services::log_service::{
36 LogExport,
37 LogService,
38};
39pub use services::metrics_service::MetricsService;
40pub use services::pipeline_service::{
41 PipelineService,
42 RunWatch,
43 WatchedRun,
44};
45pub use services::pipeline_view_service::PipelineViewService;
46pub use services::provider_service::{
47 ProviderLease,
48 ProviderService,
49};
50use tokio::sync::watch;
51
52use crate::event::EventBus;
53use crate::infrastructure::database::Repository;
54use crate::infrastructure::run_logs::LogStore;
55use crate::infrastructure::{
56 ConfigState,
57 HttpClientManager,
58};
59
60mod refresh_manager;
61pub use refresh_manager::{
62 RefreshCommand,
63 RefreshDispatcher,
64 RefreshManager,
65 RefreshMode,
66};
67
68pub struct Services {
69 pub provider_service: Arc<ProviderService>,
70 pub pipeline_service: Arc<PipelineService>,
71 pub refresh_manager: Arc<RefreshManager>,
72 pub health: HealthHandle,
73 pub health_service: Arc<ProviderHealthService>,
74 pub log_service: Arc<LogService>,
75 pub pipeline_view_service: Arc<PipelineViewService>,
76}
77
78impl Services {
79 pub fn new(
80 repository: Arc<Repository>, http_client_manager: Arc<HttpClientManager>,
81 metrics_service: Option<Arc<MetricsService>>, event_bus: Arc<dyn EventBus>,
82 config_state: Arc<ConfigState>, log_store: Arc<LogStore>,
83 ) -> Self {
84 let (health, health_receivers) = HealthHandle::channel();
85 let (dispatcher, commands) = RefreshDispatcher::channel();
86 let (mode_tx, mode_rx) = watch::channel(RefreshMode::Active);
87 config_state.attach_health(health.clone());
88 let view_repository = Arc::clone(&repository);
89 let view_config_state = Arc::clone(&config_state);
90 let view_event_bus = Arc::clone(&event_bus);
91
92 let provider_service = Arc::new(ProviderService::new(
93 Arc::clone(&repository),
94 Arc::clone(&http_client_manager),
95 Arc::clone(&event_bus),
96 Arc::new(FetchScheduler::default()),
97 health.clone(),
98 dispatcher,
99 Arc::clone(&config_state),
100 Arc::clone(&log_store),
101 ));
102 let health_service = Arc::new(ProviderHealthService::new(
103 health_receivers,
104 Arc::clone(&provider_service),
105 http_client_manager,
106 Arc::clone(&event_bus),
107 config_state,
108 mode_tx.subscribe(),
109 ));
110 let log_service = Arc::new(LogService::new(
111 log_store,
112 Arc::clone(&provider_service),
113 Arc::clone(&repository),
114 Arc::clone(&event_bus),
115 ));
116 let pipeline_service = Arc::new(PipelineService::new(
117 repository,
118 Arc::clone(&provider_service),
119 metrics_service.clone(),
120 event_bus,
121 mode_rx,
122 ));
123 let refresh_manager = Arc::new(RefreshManager::new(
124 Arc::clone(&pipeline_service),
125 metrics_service,
126 mode_tx,
127 commands,
128 ));
129 let pipeline_view_service = Arc::new(PipelineViewService::new(
130 view_repository,
131 Arc::clone(&provider_service),
132 Arc::clone(&pipeline_service),
133 view_config_state,
134 view_event_bus,
135 ));
136
137 Self {
138 provider_service,
139 pipeline_service,
140 refresh_manager,
141 health,
142 health_service,
143 log_service,
144 pipeline_view_service,
145 }
146 }
147}