Files
nym/wasm/mix-fetch/src/config.rs
2024-03-27 16:04:51 +00:00

159 lines
4.4 KiB
Rust

// Copyright 2023 - Nym Technologies SA <contact@nymtech.net>
// SPDX-License-Identifier: Apache-2.0
#![allow(unknown_lints)]
// clippy::empty_docs is not on stable as of 1.77
// due to expansion of #[wasm_bindgen] macro on `MixFetch` Config struct
#![allow(clippy::drop_non_drop)]
// due to the code generated by Tsify
#![allow(clippy::empty_docs)]
use crate::error::MixFetchError;
use serde::{Deserialize, Serialize};
use std::time::Duration;
use tsify::Tsify;
use wasm_bindgen::prelude::*;
use wasm_client_core::config::{new_base_client_config, BaseClientConfig, ConfigDebug, DebugWasm};
use wasm_client_core::helpers::parse_recipient;
use wasm_client_core::Recipient;
const DEFAULT_MIX_FETCH_TIMEOUT: Duration = Duration::from_secs(5);
const DEFAULT_MIX_FETCH_ID: &str = "_default-nym-mix-fetch";
const MIX_FETCH_CLIENT_ID_PREFIX: &str = "mix-fetch";
fn make_mix_fetch_id(id: Option<String>) -> String {
if let Some(provided) = id {
format!("{MIX_FETCH_CLIENT_ID_PREFIX}-{provided}")
} else {
DEFAULT_MIX_FETCH_ID.to_string()
}
}
#[wasm_bindgen]
#[derive(Debug, Deserialize, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct MixFetchConfig {
pub(crate) base: BaseClientConfig,
pub(crate) mix_fetch: MixFetch,
}
#[derive(Tsify, Debug, Clone, Serialize, Deserialize)]
#[tsify(into_wasm_abi, from_wasm_abi)]
#[serde(rename_all = "camelCase")]
pub struct MixFetchConfigOpts {
#[tsify(optional)]
pub id: Option<String>,
#[tsify(optional)]
pub nym_api: Option<String>,
#[tsify(optional)]
pub nyxd: Option<String>,
#[tsify(optional)]
pub debug: Option<DebugWasm>,
}
#[wasm_bindgen]
impl MixFetchConfig {
#[wasm_bindgen(constructor)]
pub fn new(
network_requester_address: String,
opts: Option<MixFetchConfigOpts>,
) -> Result<MixFetchConfig, MixFetchError> {
let version = env!("CARGO_PKG_VERSION").to_string();
if let Some(opts) = opts {
Ok(MixFetchConfig {
base: new_base_client_config(
make_mix_fetch_id(opts.id),
version,
opts.nym_api,
opts.nyxd,
opts.debug,
)?,
mix_fetch: MixFetch::new(network_requester_address)?,
})
} else {
Ok(MixFetchConfig {
base: BaseClientConfig::new(make_mix_fetch_id(None), version),
mix_fetch: MixFetch::new(network_requester_address)?,
})
}
}
}
#[wasm_bindgen]
impl MixFetchConfig {
pub fn with_mix_fetch_timeout(mut self, timeout_ms: u32) -> Self {
self.mix_fetch.debug.request_timeout = Duration::from_millis(timeout_ms as u64);
self
}
}
impl MixFetchConfig {
pub fn override_debug<D: Into<ConfigDebug>>(&mut self, debug: D) {
self.base.debug = debug.into();
}
pub fn override_mix_fetch_debug<D: Into<MixFetchDebug>>(&mut self, debug: D) {
self.mix_fetch.debug = debug.into();
}
}
#[wasm_bindgen]
#[derive(Debug, Deserialize, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct MixFetch {
pub(crate) network_requester_address: Recipient,
#[serde(default)]
pub(crate) debug: MixFetchDebug,
}
impl MixFetch {
pub(crate) fn new(network_requester_address: String) -> Result<MixFetch, MixFetchError> {
Ok(MixFetch {
network_requester_address: parse_recipient(&network_requester_address)?,
debug: Default::default(),
})
}
}
#[wasm_bindgen]
#[derive(Debug, Deserialize, PartialEq, Serialize)]
#[serde(deny_unknown_fields)]
pub struct MixFetchDebug {
pub(crate) request_timeout: Duration,
}
impl Default for MixFetchDebug {
fn default() -> Self {
MixFetchDebug {
request_timeout: DEFAULT_MIX_FETCH_TIMEOUT,
}
}
}
#[derive(Tsify, Debug, Copy, Clone, Serialize, Deserialize)]
#[tsify(into_wasm_abi, from_wasm_abi)]
#[serde(rename_all = "camelCase")]
pub struct MixFetchDebugOverride {
#[tsify(optional)]
pub request_timeout_ms: Option<u32>,
}
impl From<MixFetchDebugOverride> for MixFetchDebug {
fn from(value: MixFetchDebugOverride) -> Self {
let def = MixFetchDebug::default();
MixFetchDebug {
request_timeout: value
.request_timeout_ms
.map(|d| Duration::from_millis(d as u64))
.unwrap_or(def.request_timeout),
}
}
}