// file: crates/ksp-app-wallet-desk/src/transport_runtime.rs // version: 1 //! Composite-selected HTTP Transport runtime owned by Wallet Desk. /// Safe and executable Transport runtime retained by the application state. pub(crate) struct TransportRuntime { pool: ksp_onchain_transport_lib::HttpTransportPool, profile_id: String, role: ksp_onchain_transport_lib::HttpRoleName, } impl TransportRuntime { /// Returns the shareable HTTP Transport pool. #[must_use] pub(crate) const fn pool(&self) -> &ksp_onchain_transport_lib::HttpTransportPool { return &self.pool; } /// Returns the composite-selected Transport profile identifier. #[must_use] pub(crate) fn profile_id(&self) -> &str { return self.profile_id.as_str(); } /// Returns the logical role used by Wallet Desk read-only RPC calls. #[must_use] pub(crate) const fn role(&self) -> &ksp_onchain_transport_lib::HttpRoleName { return &self.role; } /// Returns safe configured cluster labels without endpoint URLs. #[must_use] pub(crate) fn clusters(&self) -> std::vec::Vec { let mut values = self.pool.snapshot().endpoints().iter().map(|endpoint| return endpoint.cluster().to_owned()).collect::>(); values.sort(); values.dedup(); return values; } /// Returns safe configured provider labels without endpoint URLs. #[must_use] pub(crate) fn providers(&self) -> std::vec::Vec { let mut values = self.pool.snapshot().endpoints().iter().map(|endpoint| return endpoint.provider().to_owned()).collect::>(); values.sort(); values.dedup(); return values; } } /// Resolves the composite-selected Transport profile and builds the executable HTTP pool. pub(crate) fn initialize_transport(management: &ksp_config_lib::ConfigManagement) -> ksp_core_lib::Result { let environment = ksp_config_lib::ConfigEnvironment::load(); let environment = match environment { std::result::Result::Ok(value) => value, std::result::Result::Err(error) => return std::result::Result::Err(error), }; let composite = crate::load_wallet_desk_composite(management); let composite = match composite { std::result::Result::Ok(value) => value, std::result::Result::Err(error) => return std::result::Result::Err(error), }; let profile = crate::required_composite_component_profile(&composite, crate::COMPOSITE_COMPONENT_ID_TRANSPORT, ksp_config_lib::FILE_ID_STD_TRANSPORT); let profile = match profile { std::result::Result::Ok(value) => value, std::result::Result::Err(error) => return std::result::Result::Err(error), }; let resolved = management.engine().resolve_transport_config_profile(&profile, &environment); let resolved = match resolved { std::result::Result::Ok(value) => value, std::result::Result::Err(error) => return std::result::Result::Err(error), }; let profile_id = resolved.profile_id().to_owned(); let pool = ksp_onchain_transport_lib::HttpTransportPool::new(resolved.into_settings()); let pool = match pool { std::result::Result::Ok(value) => value, std::result::Result::Err(error) => return std::result::Result::Err(error), }; let role = ksp_onchain_transport_lib::HttpRoleName::new("default"); let descriptor = ksp_onchain_transport_lib::find_http_rpc_method("getBalance"); let descriptor = match descriptor { std::option::Option::Some(value) => value, std::option::Option::None => { return std::result::Result::Err(ksp_core_lib::Error::new( crate::ERROR_CODE_APP_STATE_INVALID, "Wallet Desk Transport registry does not expose getBalance", )); }, }; let selection = pool.select_for_method(&role, descriptor); if let std::result::Result::Err(error) = selection { return std::result::Result::Err(error); } let snapshot = pool.snapshot(); ksp_logging_lib::info!(target: crate::TRACING_TARGET, domain = crate::TRACING_DOMAIN_TRANSPORT, transport_profile = profile_id.as_str(), transport_role = role.as_str(), endpoint_count = snapshot.endpoint_count(), available_endpoint_count = snapshot.available_endpoint_count(), "initialized Wallet Desk HTTP Transport from composite-managed configuration"); return std::result::Result::Ok(TransportRuntime { pool, profile_id, role }); }