use std::sync::Arc;
use helpers::{
internal_client::{AtomicClient, ClientOptions},
internal_server::{AtomicServer, ServerOptions},
types::DB,
};
#[cfg(feature = "native-db")]
use native_db::{native_db, ToKey};
#[cfg(feature = "native-db")]
use native_model::{native_model, Model};
use serde::{Deserialize, Serialize};
pub mod external {
pub use async_trait;
#[cfg(feature = "bebop")]
pub use bebop;
pub use futures_util;
pub use nanoid;
#[cfg(feature = "native-db")]
pub use native_db;
#[cfg(feature = "native-db")]
pub use native_model;
#[cfg(feature = "rustls")]
pub use rustls;
pub use tokio;
pub use tokio_tungstenite;
}
#[cfg(feature = "bebop")]
pub mod schema {
pub use crate::generated::schema::*;
}
pub mod client_sender {
pub use crate::helpers::client_sender::*;
pub use crate::helpers::internal_server::{handle_upgraded_connection, ServerOptions};
}
pub mod server_sender {
pub use crate::helpers::internal_client::{
get_internal_connect, get_ip_address, ClientOptions,
};
pub use crate::helpers::server_sender::*;
}
pub mod common {
#[cfg(feature = "bebop")]
pub use crate::helpers::common::make_response_message;
pub use crate::helpers::common::{get_setting_by_key, make_atomic_message, set_setting};
pub use crate::helpers::get_internal_websocket::get_id;
}
pub mod types {
pub use crate::helpers::types::*;
}
pub mod builder {
pub use crate::helpers::builder::{ClientOptionsBuilder, ServerOptionsBuilder};
}
pub mod metrics {
pub use crate::helpers::metrics::{Metrics, MetricsSnapshot};
}
pub mod middleware {
pub use crate::helpers::middleware::{MessageMiddleware, MiddlewareResult};
}
use server_sender::{ServerSender, ServerSenderTrait};
use tokio::sync::RwLock;
use tokio_util::sync::CancellationToken;
use types::{RwClientSenders, RwServerSender};
#[cfg(feature = "bebop")]
mod generated;
mod helpers;
#[cfg(feature = "native-db")]
#[derive(Serialize, Deserialize, Debug, Clone)]
#[native_model(id = 1004, version = 1)]
#[native_db]
pub struct Settings {
#[primary_key]
pub key: String,
pub value: Vec<u8>,
}
#[cfg(not(feature = "native-db"))]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Settings {
pub key: String,
pub value: Vec<u8>,
}
pub struct AtomicWebsocket {}
#[derive(Debug, Clone)]
pub enum AtomicWebsocketType {
Internal,
External,
}
impl AtomicWebsocket {
pub async fn get_internal_client(db: DB, mut options: ClientOptions) -> AtomicClient {
options.atomic_websocket_type = AtomicWebsocketType::Internal;
get_client(db, options, None).await
}
pub async fn get_internal_client_with_server_sender(
db: DB,
mut options: ClientOptions,
server_sender: RwServerSender,
) -> AtomicClient {
options.atomic_websocket_type = AtomicWebsocketType::Internal;
get_client(db, options, Some(server_sender)).await
}
pub async fn get_outer_client(db: DB, mut options: ClientOptions) -> AtomicClient {
options.atomic_websocket_type = AtomicWebsocketType::External;
get_client(db, options, None).await
}
pub async fn get_outer_client_with_server_sender(
db: DB,
mut options: ClientOptions,
server_sender: RwServerSender,
) -> AtomicClient {
options.atomic_websocket_type = AtomicWebsocketType::External;
get_client(db, options, Some(server_sender)).await
}
pub async fn get_internal_server(
addr: String,
option: ServerOptions,
) -> std::io::Result<AtomicServer> {
AtomicServer::new(&addr, option, None).await
}
pub async fn get_internal_server_with_client_senders(
addr: String,
option: ServerOptions,
client_senders: RwClientSenders,
) -> std::io::Result<AtomicServer> {
AtomicServer::new(&addr, option, Some(client_senders)).await
}
}
async fn get_client(
db: DB,
options: ClientOptions,
server_sender: Option<RwServerSender>,
) -> AtomicClient {
let mut server_sender = match server_sender {
Some(server_sender) => {
let server_sender_clone = server_sender.clone();
let mut server_sender_clone = server_sender_clone.write().await;
server_sender_clone.server_ip = options.url.clone();
server_sender_clone.options = options.clone();
drop(server_sender_clone);
server_sender
}
None => Arc::new(RwLock::new(ServerSender::new(
db.clone(),
options.url.clone(),
options.clone(),
))),
};
server_sender.regist(server_sender.clone()).await;
let cancel_token = CancellationToken::new();
let atomic_websocket: AtomicClient = AtomicClient {
server_sender,
options,
cancel_token,
};
match atomic_websocket.options.atomic_websocket_type {
AtomicWebsocketType::Internal => atomic_websocket.internal_initialize(db.clone()).await,
AtomicWebsocketType::External => atomic_websocket.outer_initialize(db.clone()).await,
}
atomic_websocket
}