use crate::alink::{AlinkRequest, AlinkResponse};
use crate::{Error, Result, ThreeTuple, TunnelParams};
use log::*;
use regex::Regex;
use rumqttc::{AsyncClient, QoS};
use serde::{Deserialize, Serialize};
use std::sync::Arc;
use tokio::sync::mpsc;
use tokio::sync::mpsc::{Receiver, Sender};
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct EdgeDebugSwitch {
pub status: i32,
}
impl EdgeDebugSwitch {
pub fn is_open(&self) -> bool {
self.status != 0
}
}
#[derive(Debug, Clone)]
pub struct RemoteAccessOptions {
pub three: Arc<ThreeTuple>,
pub cloud_host: String,
pub cloud_port: u32, }
impl RemoteAccessOptions {
pub fn new(three: Arc<ThreeTuple>) -> Self {
Self {
three,
cloud_host: "backend-iotx-remote-debug.aliyun.com".to_string(),
cloud_port: 443,
}
}
}
#[derive(Debug, Clone)]
pub enum SecureTunnelNotify {
Connect(ConnectOrUpdate),
Update(ConnectOrUpdate),
Close(Close),
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct ConnectOrUpdate {
pub schema: Option<String>,
pub path: String,
pub token_expire: i32,
pub tunnel_id: String,
pub payload_mode: Option<String>,
pub port: u16,
pub host: String,
pub operation: Option<String>,
pub uri: String,
pub token: String,
pub close_reason: Option<String>,
pub udi: Option<String>,
}
impl From<ConnectOrUpdate> for TunnelParams {
fn from(data: ConnectOrUpdate) -> Self {
Self {
id: data.tunnel_id,
host: data.host,
port: format!("{}", data.port),
path: data.path,
token: data.token,
}
}
}
impl From<ConnectOrUpdate> for SecureTunnelNotify {
fn from(data: ConnectOrUpdate) -> Self {
match data.operation.as_ref().map(|s| s.as_str()) {
Some("connect") => Self::Connect(data),
Some("close") => Self::Close(Close {
tunnel_id: data.tunnel_id,
close_reason: data.close_reason,
operation: data.operation,
}),
_ => Self::Update(data),
}
}
}
#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct Close {
pub tunnel_id: String,
pub operation: Option<String>,
pub close_reason: Option<String>,
}