mod config;
mod handles;
mod protocol;
#[cfg(feature = "std")]
mod tcp;
#[cfg(feature = "std")]
pub use tcp::{OBSERVABILITY_CHANNEL, PushClient, PushWriter, PushedFrame, TcpRemoteTransport};
pub use config::{SdkConfig, build_channel_handle, build_conversation_handle};
pub use handles::{
RemoteChannelHandle, RemoteConversationHandle, SdkChannelHandle, SdkConversationHandle,
};
#[cfg(test)]
mod tests;
use alloc::string::{String, ToString};
use alloc::sync::Arc;
use core::time::Duration;
use crate::connection::{ConnectionPoolConfig, ReconnectConfig, ReconnectJitter};
use crate::{ConversationId, SdkError};
use self::protocol::{ProtocolRemoteTransport, RemoteTransport};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct ServerAddress(String);
impl ServerAddress {
pub fn new(value: impl Into<String>) -> Result<Self, SdkError> {
let value = value.into();
if value.trim().is_empty() {
return Err(connection_error("remote mode requires a server address"));
}
Ok(Self(value))
}
#[must_use]
pub fn as_str(&self) -> &str {
self.0.as_str()
}
}
#[derive(Clone, Debug)]
pub struct RemoteConfig {
pub server_address: ServerAddress,
pub channel_name: String,
pub conversation_id: ConversationId,
pub pool_config: ConnectionPoolConfig,
pub reconnect_config: ReconnectConfig,
transport: Arc<dyn RemoteTransport>,
}
impl RemoteConfig {
pub fn new(
server_address: impl Into<String>,
channel_name: impl Into<String>,
conversation_id: impl Into<ConversationId>,
pool_config: ConnectionPoolConfig,
) -> Result<Self, SdkError> {
Ok(Self {
server_address: ServerAddress::new(server_address)?,
channel_name: channel_name.into(),
conversation_id: conversation_id.into(),
pool_config: pool_config.validate()?,
reconnect_config: ReconnectConfig::default(),
transport: Arc::new(ProtocolRemoteTransport),
})
}
#[must_use]
pub const fn with_reconnect_config(mut self, reconnect_config: ReconnectConfig) -> Self {
self.reconnect_config = reconnect_config;
self
}
#[cfg(feature = "std")]
pub fn connect_tcp(mut self) -> Result<Self, SdkError> {
let transport = self::tcp::TcpRemoteTransport::connect(&self.server_address)?;
self.transport = Arc::new(transport);
Ok(self)
}
}
#[derive(Clone, Copy, Debug, Default)]
pub struct NoJitter;
impl ReconnectJitter for NoJitter {
fn jitter(&mut self, attempt: u32, capped_delay: Duration) -> Duration {
core::hint::black_box((attempt, capped_delay));
Duration::ZERO
}
}
fn connection_error(description: &str) -> SdkError {
SdkError::Connection {
description: description.to_string(),
}
}