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}