use crate::common::generate_id;
use crate::server::config::ServerConfig;
use crate::server::connection::ConnectionManager;
use crate::server::handle::ServerHandle;
use crate::server::transports::server_core::ServerCore;
use crate::transport::connection::Connection;
use std::sync::Arc;
use tokio::sync::Mutex;
pub struct ServerConnectionHelper;
impl ServerConnectionHelper {
pub async fn setup_new_connection(
connection: Box<dyn Connection>,
manager: Arc<ConnectionManager>,
config: &ServerConfig,
core: Arc<ServerCore>,
) -> Result<String, crate::common::error::FlareError> {
let connection_id = generate_id();
let requires_auth = core.auth_enabled();
manager
.add_connection_with_limit(
connection_id.clone(),
connection,
None,
requires_auth,
config.max_connections,
)
.map_err(|e| {
crate::common::error::FlareError::connection_failed(format!(
"Failed to add connection: {}",
e
))
})?;
let observer = core.create_observer_with_core(connection_id.clone(), Arc::clone(&core));
if let Some((conn, _)) = manager.get_connection(&connection_id) {
let mut c = conn.lock().await;
c.add_observer(observer);
} else {
return Err(crate::common::error::FlareError::connection_failed(
"Failed to get connection after adding".to_string(),
));
}
Ok(connection_id)
}
pub async fn stop_server(
core: &ServerCore,
is_running: &Arc<Mutex<bool>>,
) -> Result<(), crate::common::error::FlareError> {
*is_running.lock().await = false;
core.stop_heartbeat();
let connection_ids = core.list_connections().await;
for conn_id in connection_ids {
let manager_trait = core.connection_manager_trait();
if let Some((conn, _)) = manager_trait.get_connection(&conn_id).await {
let mut c = conn.lock().await;
let _ = c.close().await;
}
let _ = ServerHandle::disconnect(core, &conn_id).await;
}
Ok(())
}
}