Skip to main content

ccs_proxy/
handle.rs

1use crate::capture::CaptureEvent;
2use crate::provider::ProviderKind;
3use tokio::sync::{broadcast, oneshot};
4use tokio::task::JoinHandle;
5use url::Url;
6
7pub struct ProxyHandle {
8    pub provider: ProviderKind,
9    pub upstream: Url,
10    pub proxy_port: u16,
11    pub api_port: Option<u16>,
12    pub(crate) shutdown_tx: Option<oneshot::Sender<()>>,
13    pub(crate) join: Option<JoinHandle<()>>,
14    pub(crate) events: broadcast::Sender<CaptureEvent>,
15}
16
17impl Drop for ProxyHandle {
18    fn drop(&mut self) {
19        if let Some(tx) = self.shutdown_tx.take() {
20            let _ = tx.send(());
21        }
22    }
23}
24
25impl ProxyHandle {
26    pub fn subscribe_events(&self) -> broadcast::Receiver<CaptureEvent> {
27        self.events.subscribe()
28    }
29
30    pub fn event_sender(&self) -> &broadcast::Sender<CaptureEvent> {
31        &self.events
32    }
33
34    pub fn is_finished(&self) -> bool {
35        self.join.as_ref().is_some_and(|j| j.is_finished())
36    }
37
38    pub async fn shutdown(mut self) {
39        if let Some(tx) = self.shutdown_tx.take() {
40            let _ = tx.send(());
41        }
42        if let Some(join) = self.join.take() {
43            let _ = join.await;
44        }
45    }
46}