diff options
| author | Markus Pettersson <markus.pettersson@mullvad.net> | 2023-11-16 15:17:11 +0100 |
|---|---|---|
| committer | Markus Pettersson <markus.pettersson@mullvad.net> | 2023-12-04 09:06:48 +0100 |
| commit | e31d9e01fa4e4635c4ddead14b18fa7e8381e3f6 (patch) | |
| tree | 354f6c42b13bcbe5e28181936e3a3de6aab7c026 /mullvad-daemon/src/api.rs | |
| parent | 9358da4abff1855b6ffacee9b9bdbe7f89349198 (diff) | |
| download | mullvadvpn-e31d9e01fa4e4635c4ddead14b18fa7e8381e3f6.tar.xz mullvadvpn-e31d9e01fa4e4635c4ddead14b18fa7e8381e3f6.zip | |
Construct `AccessModeSelectorHandle` by calling `AccessModeSelector::spawn`
Construct an `AccessModeSelectorHandle` by calling
`AccessModeSelector::spawn`, which is consistent with how actors are
spawned in other parts of the `mullvad-daemon`.
Diffstat (limited to 'mullvad-daemon/src/api.rs')
| -rw-r--r-- | mullvad-daemon/src/api.rs | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/mullvad-daemon/src/api.rs b/mullvad-daemon/src/api.rs index 47a9969a76..ef6d2ff106 100644 --- a/mullvad-daemon/src/api.rs +++ b/mullvad-daemon/src/api.rs @@ -46,21 +46,6 @@ pub struct AccessModeSelectorHandle { } impl AccessModeSelectorHandle { - pub fn new( - cache_dir: PathBuf, - relay_selector: RelaySelector, - connection_modes: Vec<AccessMethodSetting>, - ) -> Self { - let (cmd_tx, cmd_rx) = mpsc::unbounded(); - - let mut actor = AccessModeSelector { - cmd_rx, - state: ApiConnectionModeProvider::new(cache_dir, relay_selector, connection_modes), - }; - tokio::spawn(async move { actor.run().await }); - Self { cmd_tx } - } - async fn send_command<T>(&self, make_cmd: impl FnOnce(ResponseTx<T>) -> Message) -> Result<T> { let (tx, rx) = oneshot::channel(); // TODO(markus): Error handling @@ -120,7 +105,36 @@ pub struct AccessModeSelector { } impl AccessModeSelector { - async fn run(&mut self) { + pub fn spawn( + cache_dir: PathBuf, + relay_selector: RelaySelector, + connection_modes: Vec<AccessMethodSetting>, + ) -> AccessModeSelectorHandle { + let (cmd_tx, cmd_rx) = mpsc::unbounded(); + + let state = + match ApiConnectionModeProvider::new(cache_dir, relay_selector, connection_modes) { + Ok(provider) => provider, + Err(api::Error::NoAccessMethods) => { + // No settings seem to have been found. Default to using the the + // direct access method. + let default = mullvad_types::access_method::Settings::direct(); + api::ApiConnectionModeProvider::new( + cache_dir.clone(), + relay_selector.clone(), + vec![default], + ) + .expect( + "Failed to create the data structure responsible for managing access methods", + ) + } + }; + let selector = AccessModeSelector { cmd_rx, state }; + tokio::spawn(selector.into_future()); + AccessModeSelectorHandle { cmd_tx } + } + + async fn into_future(mut self) { while let Some(cmd) = self.cmd_rx.next().await { let _ = match cmd { Message::Get(tx) => self.on_get_access_method(tx), |
