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