Skip to main content

aranya_client/config/team/
quic_sync.rs

1//! Configuration for team synchronization over QUIC connections.
2//!
3//! # Overview
4//!
5//! There are two main configuration types:
6//! - [`CreateTeamQuicSyncConfig`] - For creating new teams
7//! - [`AddTeamQuicSyncConfig`] - For adding members to existing teams
8
9use aranya_daemon_api::{AddSeedMode, CreateSeedMode, SEED_IKM_SIZE};
10use tracing::error;
11
12use crate::{error::InvalidArg, ConfigError, Result};
13
14/// Configuration for creating a new team with QUIC synchronization.
15#[derive(Clone, Debug)]
16pub struct CreateTeamQuicSyncConfig {
17    mode: CreateSeedMode,
18}
19
20impl CreateTeamQuicSyncConfig {
21    /// Creates a new builder for team creation configuration.
22    pub fn builder() -> CreateTeamQuicSyncConfigBuilder {
23        CreateTeamQuicSyncConfigBuilder::default()
24    }
25}
26
27/// Configuration for adding members to an existing team with QUIC synchronization.
28#[derive(Clone, Debug)]
29pub struct AddTeamQuicSyncConfig {
30    mode: AddSeedMode,
31}
32
33impl AddTeamQuicSyncConfig {
34    /// Creates a new builder for team member addition configuration.
35    pub fn builder() -> AddTeamQuicSyncConfigBuilder {
36        AddTeamQuicSyncConfigBuilder::default()
37    }
38}
39
40/// Builder for [`CreateTeamQuicSyncConfig`]
41#[derive(Debug, Default)]
42pub struct CreateTeamQuicSyncConfigBuilder {
43    mode: CreateSeedMode,
44}
45
46impl CreateTeamQuicSyncConfigBuilder {
47    /// Sets the PSK seed mode.
48    #[doc(hidden)]
49    pub fn mode(mut self, mode: CreateSeedMode) -> Self {
50        self.mode = mode;
51        self
52    }
53
54    /// Sets the seed to be generated.
55    ///
56    /// Overwrites [`Self::seed_ikm`].
57    pub fn gen_seed(mut self) -> Self {
58        self.mode = CreateSeedMode::Generate;
59        self
60    }
61
62    /// Sets the seed mode to 'IKM'.
63    ///
64    /// Overwrites [`Self::gen_seed`].
65    pub fn seed_ikm(mut self, ikm: [u8; SEED_IKM_SIZE]) -> Self {
66        self.mode = CreateSeedMode::IKM(ikm.into());
67        self
68    }
69
70    /// Builds the config.
71    pub fn build(self) -> Result<CreateTeamQuicSyncConfig> {
72        Ok(CreateTeamQuicSyncConfig { mode: self.mode })
73    }
74}
75
76/// Builder for [`AddTeamQuicSyncConfig`]
77#[derive(Debug, Default)]
78pub struct AddTeamQuicSyncConfigBuilder {
79    mode: Option<AddSeedMode>,
80}
81
82impl AddTeamQuicSyncConfigBuilder {
83    /// Sets the PSK seed mode.
84    #[doc(hidden)]
85    pub fn mode(mut self, mode: AddSeedMode) -> Self {
86        self.mode = Some(mode);
87        self
88    }
89
90    /// Sets the seed mode to 'IKM'.
91    ///
92    /// Overwrites [`Self::wrapped_seed`].
93    pub fn seed_ikm(mut self, ikm: [u8; SEED_IKM_SIZE]) -> Self {
94        self.mode = Some(AddSeedMode::IKM(ikm.into()));
95        self
96    }
97
98    /// Sets the seed mode to 'Wrapped'.
99    ///
100    /// Overwrites [`Self::seed_ikm`].
101    pub fn wrapped_seed(mut self, wrapped_seed: &[u8]) -> Result<Self> {
102        let wrapped = postcard::from_bytes(wrapped_seed).map_err(|err| {
103            error!(error = %err, "could not deserialize wrapped_seed");
104            ConfigError::InvalidArg(InvalidArg::new("wrapped_seed", "could not deserialize"))
105        })?;
106        self.mode = Some(AddSeedMode::Wrapped(wrapped));
107        Ok(self)
108    }
109
110    /// Builds the config.
111    pub fn build(self) -> Result<AddTeamQuicSyncConfig> {
112        let Some(mode) = self.mode else {
113            return Err(ConfigError::InvalidArg(InvalidArg::new(
114                "mode",
115                "`mode` must be set in order to build an `AddQuicSyncConfig`",
116            ))
117            .into());
118        };
119
120        Ok(AddTeamQuicSyncConfig { mode })
121    }
122}
123
124impl From<CreateTeamQuicSyncConfig> for aranya_daemon_api::CreateTeamQuicSyncConfig {
125    fn from(value: CreateTeamQuicSyncConfig) -> Self {
126        aranya_daemon_api::CreateTeamQuicSyncConfig {
127            seed_mode: value.mode,
128        }
129    }
130}
131
132impl From<AddTeamQuicSyncConfig> for aranya_daemon_api::AddTeamQuicSyncConfig {
133    fn from(value: AddTeamQuicSyncConfig) -> Self {
134        aranya_daemon_api::AddTeamQuicSyncConfig {
135            seed_mode: value.mode,
136        }
137    }
138}