use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum BrowserProxy {
Https { address: String },
Socks5 { address: String },
HttpAuth {
address: String,
username: String,
password: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct BrowsrClientConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub window_size: Option<(u32, u32)>,
#[serde(skip_serializing_if = "Option::is_none")]
pub headless: Option<bool>,
pub enable_stealth_mode: bool,
pub enable_real_emulation: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub proxy: Option<BrowserProxy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub analysis_model_settings: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_agent: Option<String>,
#[serde(default)]
pub use_random_user_agent: bool,
#[serde(default = "default_true")]
pub disable_automation_detection: bool,
}
fn default_true() -> bool {
true
}
impl Default for BrowsrClientConfig {
fn default() -> Self {
Self {
window_size: None,
headless: Some(true),
enable_stealth_mode: true,
enable_real_emulation: true,
proxy: None,
analysis_model_settings: None,
user_agent: None,
use_random_user_agent: false,
disable_automation_detection: true,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct BrowserCookie {
pub name: String,
pub value: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub expires: Option<f64>,
#[serde(default)]
pub http_only: bool,
#[serde(default)]
pub secure: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub same_site: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub priority: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source_scheme: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct BrowserSessionState {
pub cookies: Vec<BrowserCookie>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_url: Option<String>,
#[schemars(with = "String")]
pub captured_at: chrono::DateTime<chrono::Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct BrowserSessionRecord {
pub user_id: String,
pub state: BrowserSessionState,
#[schemars(with = "String")]
pub updated_at: chrono::DateTime<chrono::Utc>,
}