torrust_tracker/servers/udp/server/
spawner.rs

1//! A thin wrapper for tokio spawn to launch the UDP server launcher as a new task.
2use std::net::SocketAddr;
3use std::sync::Arc;
4
5use derive_more::derive::Display;
6use derive_more::Constructor;
7use tokio::sync::oneshot;
8use tokio::task::JoinHandle;
9
10use super::launcher::Launcher;
11use crate::bootstrap::jobs::Started;
12use crate::core::Tracker;
13use crate::servers::signals::Halted;
14
15#[derive(Constructor, Copy, Clone, Debug, Display)]
16#[display("(with socket): {bind_to}")]
17pub struct Spawner {
18    pub bind_to: SocketAddr,
19}
20
21impl Spawner {
22    /// It spawns a new task to run the UDP server instance.
23    ///
24    /// # Panics
25    ///
26    /// It would panic if unable to resolve the `local_addr` from the supplied ´socket´.
27    pub fn spawn_launcher(
28        &self,
29        tracker: Arc<Tracker>,
30        tx_start: oneshot::Sender<Started>,
31        rx_halt: oneshot::Receiver<Halted>,
32    ) -> JoinHandle<Spawner> {
33        let spawner = Self::new(self.bind_to);
34
35        tokio::spawn(async move {
36            Launcher::run_with_graceful_shutdown(tracker, spawner.bind_to, tx_start, rx_halt).await;
37            spawner
38        })
39    }
40}