use std::time::Duration;
use crate::protocol::{MqttVersion, QoS};
pub(super) const DEFAULT_OPERATION_TIMEOUT_SECS: u32 = 15;
#[derive(Debug, Clone, PartialEq, Eq, uniffi::Record)]
pub struct WillOptions {
pub topic: String,
pub payload: Vec<u8>,
pub qos: QoS,
pub retain: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, uniffi::Record)]
pub struct TlsOptions {
pub ca_cert_pem: Option<Vec<u8>>,
pub client_cert_pem: Option<Vec<u8>>,
pub client_key_pem: Option<Vec<u8>>,
pub insecure_skip_certificate_verification: bool,
}
impl TlsOptions {
pub fn new() -> Self {
TlsOptions {
ca_cert_pem: None,
client_cert_pem: None,
client_key_pem: None,
insecure_skip_certificate_verification: false,
}
}
}
impl Default for TlsOptions {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone, PartialEq, Eq, uniffi::Record)]
pub struct ConnectOptions {
pub host: String,
pub port: u16,
pub client_id: String,
pub version: MqttVersion,
pub clean_start: bool,
pub keep_alive_secs: u16,
pub username: Option<String>,
pub password: Option<Vec<u8>>,
pub will: Option<WillOptions>,
pub connect_timeout_secs: u32,
pub operation_timeout_secs: u32,
pub auto_reconnect: bool,
pub reconnect_backoff_secs: u32,
pub reconnect_max_backoff_secs: u32,
pub tls: Option<TlsOptions>,
}
impl ConnectOptions {
pub fn new(
host: impl Into<String>,
port: u16,
client_id: impl Into<String>,
version: MqttVersion,
) -> Self {
ConnectOptions {
host: host.into(),
port,
client_id: client_id.into(),
version,
clean_start: true,
keep_alive_secs: 30,
username: None,
password: None,
will: None,
connect_timeout_secs: 10,
operation_timeout_secs: 0,
auto_reconnect: false,
reconnect_backoff_secs: 0,
reconnect_max_backoff_secs: 0,
tls: None,
}
}
pub(super) fn operation_timeout(&self) -> Duration {
let secs = if self.operation_timeout_secs == 0 {
DEFAULT_OPERATION_TIMEOUT_SECS
} else {
self.operation_timeout_secs
};
Duration::from_secs(secs as u64)
}
pub(super) fn initial_reconnect_backoff(&self) -> Duration {
let secs = if self.reconnect_backoff_secs == 0 {
1
} else {
self.reconnect_backoff_secs
};
Duration::from_secs(secs as u64)
}
pub(super) fn max_reconnect_backoff(&self) -> Duration {
let secs = if self.reconnect_max_backoff_secs == 0 {
30
} else {
self.reconnect_max_backoff_secs
};
Duration::from_secs(secs as u64)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, uniffi::Record)]
pub struct ConnectResult {
pub session_present: bool,
pub reason_code: u8,
}
#[derive(Debug, Clone, PartialEq, Eq, uniffi::Record)]
pub struct MqttMessage {
pub topic: String,
pub payload: Vec<u8>,
pub qos: QoS,
pub retain: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, uniffi::Record)]
pub struct SubscribeResult {
pub reason_code: u8,
}
#[uniffi::export(with_foreign)]
pub trait MqttMessageListener: Send + Sync {
fn on_message(&self, message: MqttMessage);
fn on_disconnected(&self, reason: String);
}