use serde::{Deserialize, Serialize}; use crate::secret::SecretMaterial; #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(default)] pub struct InternalConfig { pub service_key: String, pub rpc: InternalRpcConfig, pub event_client: EventClientConfig, } impl InternalConfig { pub fn is_valid(&self) -> Result<(), String> { if !self.service_key.is_empty() && self.service_key.len() < 32 { return Err("internal.service_key must be at least 32 characters".to_string()); } self.rpc.validate()?; self.event_client.validate()?; Ok(()) } } /// serve 进程暴露的内部 RPC 服务端参数。 #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(default)] pub struct InternalRpcConfig { pub listen_address: String, pub rpc_key: String, } impl InternalRpcConfig { pub fn validate(&self) -> Result<(), String> { if self.listen_address.trim().is_empty() { return Ok(()); } if !self.rpc_key.is_empty() && self.rpc_key.len() < 32 { return Err("internal.rpc.rpc_key must be at least 32 characters".to_string()); } Ok(()) } } /// serve 进程访问 event 内部 RPC 的客户端参数(含身份信封公钥与 HMAC 密钥)。 #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(default)] pub struct EventClientConfig { pub endpoint: String, pub rpc_key: String, pub timeout_secs: u64, pub key_id: String, #[serde(default)] pub public_key: SecretMaterial, pub mac_key_id: String, #[serde(default)] pub mac_key: SecretMaterial, pub clock_skew_secs: u64, pub envelope_ttl_secs: u64, } impl EventClientConfig { pub fn validate(&self) -> Result<(), String> { if self.endpoint.trim().is_empty() { return Ok(()); } if !(self.endpoint.starts_with("http://") || self.endpoint.starts_with("https://")) { return Err("internal.event_client.endpoint must be an http(s) URL".to_string()); } if !self.rpc_key.is_empty() && self.rpc_key.len() < 32 { return Err("internal.event_client.rpc_key must be at least 32 characters".to_string()); } Ok(()) } }