Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Threema/libthreema/lib/src/bindings/wasm/common/   (Social Medium ©)  Datei vom 26.9.2026 mit Größe 7 kB image not shown  

Quelle  config.rs   Sprache: Rust

 

//! Bindings for the configuration.
use core::time::Duration;

use js_sys::Error;
use serde::Deserialize;
use serde_bytes::ByteBuf;
use tsify::Tsify;

use crate::common::{config, keys::PublicKey};

/// Binding version of [`config::BlobServerConfig`].
#[derive(Tsify, Deserialize)]
#[serde(rename_all = "camelCase")]
#[tsify(from_wasm_abi)]
#[expect(clippy::struct_field_names, reason = "All fields intentionally end with URL")]
pub struct BlobServerConfig {
    #[expect(missing_docs, reason = "Binding version")]
    pub upload_url: String,

    #[expect(missing_docs, reason = "Binding version")]
    pub download_url: String,

    #[expect(missing_docs, reason = "Binding version")]
    pub done_url: String,
}
impl TryFrom<BlobServerConfig> for config::BlobServerConfig {
    type Error = Error;

    fn try_from(config: BlobServerConfig) -> Result<Self, Self::Error> {
        Ok(Self {
            upload_url: config::BlobServerUploadUrl::try_from(config.upload_url)
                .map_err(|error| Error::new(&format!("Blob server 'upload_url' invalid: {error}")))?,

            download_url: config::BlobServerDownloadUrl::try_from(config.download_url)
                .map_err(|error| Error::new(&format!("Blob server 'download_url' invalid: {error}")))?,

            done_url: config::BlobServerDoneUrl::try_from(config.done_url)
                .map_err(|error| Error::new(&format!("Blob server 'done_url' invalid: {error}")))?,
        })
    }
}

/// Binding version of [`config::BlobMirrorServerConfig`].
#[derive(Tsify, Deserialize)]
#[serde(rename_all = "camelCase")]
#[tsify(from_wasm_abi)]
#[expect(clippy::struct_field_names, reason = "All fields intentionally end with URL")]
pub struct BlobMirrorServerConfig {
    #[expect(missing_docs, reason = "Binding version")]
    pub upload_url: String,

    #[expect(missing_docs, reason = "Binding version")]
    pub download_url: String,

    #[expect(missing_docs, reason = "Binding version")]
    pub done_url: String,
}
impl TryFrom<BlobMirrorServerConfig> for config::BlobMirrorServerConfig {
    type Error = Error;

    fn try_from(config: BlobMirrorServerConfig) -> Result<Self, Self::Error> {
        Ok(Self {
            upload_url: config::BlobMirrorServerUploadUrl::try_from(config.upload_url)
                .map_err(|error| Error::new(&format!("Blob mirror server 'upload_url' invalid: {error}")))?,

            download_url: config::BlobMirrorServerDownloadUrl::try_from(config.download_url).map_err(
                |error| Error::new(&format!("Blob mirror server 'download_url' invalid: {error}")),
            )?,

            done_url: config::BlobMirrorServerDoneUrl::try_from(config.done_url)
                .map_err(|error| Error::new(&format!("Blob mirror server 'done_url' invalid: {error}")))?,
        })
    }
}

/// Binding version of [`config::MultiDeviceConfig`].
#[derive(Tsify, Deserialize)]
#[serde(rename_all = "camelCase")]
#[tsify(from_wasm_abi)]
pub struct MultiDeviceConfig {
    #[expect(missing_docs, reason = "Binding version")]
    pub rendezvous_server_url: String,

    #[expect(missing_docs, reason = "Binding version")]
    pub mediator_server_url: String,

    #[expect(missing_docs, reason = "Binding version")]
    pub blob_mirror_server: BlobMirrorServerConfig,
}
impl TryFrom<MultiDeviceConfig> for config::MultiDeviceConfig {
    type Error = Error;

    fn try_from(config: MultiDeviceConfig) -> Result<Self, Self::Error> {
        Ok(Self {
            rendezvous_server_url: config::RendezvousServerBaseUrl::try_from(config.rendezvous_server_url)
                .map_err(|error| Error::new(&format!("'rendezvous_server_url' invalid: {error}")))?,

            mediator_server_url: config::MediatorServerBaseUrl::try_from(config.mediator_server_url)
                .map_err(|error| Error::new(&format!("'mediator_server_url' invalid: {error}")))?,

            blob_mirror_server: config.blob_mirror_server.try_into()?,
        })
    }
}

/// Binding version of [`config::OnPremConfig`].
#[derive(Tsify, Deserialize)]
#[serde(rename_all = "camelCase")]
#[tsify(from_wasm_abi)]
pub struct OnPremConfig {
    #[expect(missing_docs, reason = "Binding version")]
    pub version: config::OnPremConfigVersion,

    /// Configuration refresh interval in seconds.
    pub refresh_interval_s: u64,

    #[expect(missing_docs, reason = "Binding version")]
    pub chat_server_address: config::ChatServerAddress,

    #[expect(missing_docs, reason = "Binding version")]
    pub chat_server_public_keys: Vec<ByteBuf>,

    #[expect(missing_docs, reason = "Binding version")]
    pub directory_server_url: String,

    #[expect(missing_docs, reason = "Binding version")]
    pub blob_server: BlobServerConfig,

    #[expect(missing_docs, reason = "Binding version")]
    pub work_server_url: String,

    #[expect(missing_docs, reason = "Binding version")]
    pub gateway_avatar_server_url: String,

    #[expect(missing_docs, reason = "Binding version")]
    pub safe_server_url: String,

    #[expect(missing_docs, reason = "Binding version")]
    pub multi_device: Option<MultiDeviceConfig>,
}
impl TryFrom<OnPremConfig> for config::OnPremConfig {
    type Error = Error;

    fn try_from(config: OnPremConfig) -> Result<Self, Self::Error> {
        let chat_server_public_keys = config
            .chat_server_public_keys
            .into_iter()
            .map(|public_key| {
                PublicKey::try_from(public_key.as_slice())
                    .map_err(|_| Error::new("Public key in 'chat_server_public_keys' must be 32 bytes"))
            })
            .collect::<Result<_, _>>()?;

        Ok(Self {
            version: config.version,

            refresh_interval: Duration::from_secs(config.refresh_interval_s),

            chat_server_address: config.chat_server_address,

            chat_server_public_keys,

            directory_server_url: config::DirectoryServerBaseUrl::try_from(config.directory_server_url)
                .map_err(|error| Error::new(&format!("'directory_server_url' invalid: {error}")))?,

            blob_server: config.blob_server.try_into()?,

            work_server_url: config::WorkServerBaseUrl::try_from(config.work_server_url)
                .map_err(|error| Error::new(&format!("'work_server_url' invalid: {error}")))?,

            gateway_avatar_server_url: config::GatewayAvatarBaseServerUrl::try_from(
                config.gateway_avatar_server_url,
            )
            .map_err(|error| Error::new(&format!("'gateway_avatar_server_url' invalid: {error}")))?,

            safe_server_url: config::SafeServerBaseUrl::try_from(config.safe_server_url)
                .map_err(|error| Error::new(&format!("'safe_server_url' invalid: {error}")))?,

            multi_device: config.multi_device.map(MultiDeviceConfig::try_into).transpose()?,
        })
    }
}

/// Binding version of [`config::ConfigEnvironment`].
#[derive(Tsify, Deserialize)]
#[serde(
    tag = "type",
    content = "value",
    rename_all = "kebab-case",
    rename_all_fields = "camelCase"
)]
#[tsify(from_wasm_abi)]
pub enum ConfigEnvironment {
    #[expect(missing_docs, reason = "Binding version")]
    Sandbox,

    #[expect(missing_docs, reason = "Binding version")]
    Production,

    #[expect(missing_docs, reason = "Binding version")]
    OnPrem(Box<OnPremConfig>),
}
impl TryFrom<ConfigEnvironment> for config::ConfigEnvironment {
    type Error = Error;

    fn try_from(environment: ConfigEnvironment) -> Result<Self, Self::Error> {
        match environment {
            ConfigEnvironment::Sandbox => Ok(Self::Sandbox),
            ConfigEnvironment::Production => Ok(Self::Production),
            ConfigEnvironment::OnPrem(config) => {
                Ok(Self::OnPrem(Box::new(config::OnPremConfig::try_from(*config)?)))
            },
        }
    }
}

Messung
CHZG
8210010094

¤ Dauer der Verarbeitung: 0.0 Sekunden  (vorverarbeitet am  2026-11-04) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover


Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.